(包括可能被传递参数时修改的函数参数).
$return = 函数返回值
$return = 参数 1
$return = 参数 2
...
$return = 参数 n
帮助文档中对dllcall的说明,$return是函数的返回值 回复 15# 飘云
谢你的热情回答。把TrackPopupMenuEx函数的第二个参数设为0x0100了,不知为什么,guiGetMsg()函数得到的值永远是-11,也就是不会执行你鼠标选择菜单的东西了。
不过,我在EndSwitch后面加一行GUIDelete()就可以解决我在14楼提出的问题了。
反正不管在Switch里有没有执行,出了Switch后,都得删掉那个gui窗口的。 回复 17# happytc
这样做还是有问题:虽然gui已经删了,但永远在while循环里了。
目的是想,当菜单出来后,不管是选了菜单项目,还是点别的地方后菜单消失,都退出程序(若把它写成函数,就退出函数,因为这个菜单功能,只是整个程序的一个功能而已),只想用热键呼出这个菜单。 又学习了一招嘿嘿 本帖最后由 飘云 于 2011-3-8 13:06 编辑
LZ你还是没仔细看关于TrackPopupMenuEx函数的说明呀,
TPM_RETURNCMD;若设置此标志;函数将用户所选菜单项的标识符返回到返回值里。
(补充:当TrackPopupMenu的返回值大于0,就说明用户从弹出菜单中选择了一个菜单。以返回的ID号为参数wParam的值,程序给自己发送了一个WM_SYSCOMMAND消息) 回复 20# 飘云
关键是你在15楼那样的,是可以得TrackPopupMenuEx的返回值,但GUIGetMsg()得到的值不对呀,永远都是-11. 从而15楼的代码没法执行到while里的MsgBox(0,0,"0k")呀
#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $result
$form = GUICreate("", 100, 100, -1000, -1000, -1, -1,WinGetHandle(AutoItWinGetTitle()))
GUISetState()
$context = GUICtrlCreateContextMenu()
$item_1 = GUICtrlCreateMenuItem("System32",$context)
$item_2 = GUICtrlCreateMenuItem("My Documents",$context)
GUICtrlCreateMenuItem("",$context)
$item_3 = GUICtrlCreateMenuItem("C Drive",$context)
$item_4 = GUICtrlCreateMenuItem("D Drive",$context)
GUICtrlCreateMenuItem("",$context)
$item_5 = GUICtrlCreateMenu("Utilities",$context)
$item_6 = GUICtrlCreateMenu("Command Line",$context)
GUICtrlCreateMenuItem("",$context)
$item_7 = GUICtrlCreateMenuItem("Internet",$context)
GUICtrlCreateMenuItem("",$context)
$item_8 = GUICtrlCreateMenuItem("Configure...",$context)
ShowMenu($form,$context)
While 1
Sleep(100)
Switch $result
Case 0
ExitLoop
Case $item_1
MsgBox(0,"","1")
ExitLoop
Case $item_2
MsgBox(0,"","ok")
ExitLoop
Case Else
ExitLoop
EndSwitch
WEnd
GUIDelete()
Func ShowMenu($hWnd, $nContextID)
Local $moPos = MouseGetPos()
$result=DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", GUICtrlGetHandle($nContextID), "int", 0x0100, "int", $moPos, "int", $moPos, "hwnd", $hWnd, "ptr", 0);弹出菜单
EndFunc ;==>按钮弹出菜单函数
既然$result有返回标识符,那么直接用$result不就行了=。= 本帖最后由 飘云 于 2011-3-8 13:34 编辑
另外,如果只是想要点一下就消失的话,其实是不用循环的,循环的作用是保留GUI,你只是需要一个功能选择,选完关闭的效果,那么循环就没意义了,当菜单处于弹出状态时,脚本是被暂停的
#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
Global $result
$form = GUICreate("", 100, 100, -1000, -1000, -1, -1,WinGetHandle(AutoItWinGetTitle()))
GUISetState()
$context = GUICtrlCreateContextMenu()
$item_1 = GUICtrlCreateMenuItem("System32",$context)
$item_2 = GUICtrlCreateMenuItem("My Documents",$context)
GUICtrlCreateMenuItem("",$context)
$item_3 = GUICtrlCreateMenuItem("C Drive",$context)
$item_4 = GUICtrlCreateMenuItem("D Drive",$context)
GUICtrlCreateMenuItem("",$context)
$item_5 = GUICtrlCreateMenu("Utilities",$context)
$item_6 = GUICtrlCreateMenu("Command Line",$context)
GUICtrlCreateMenuItem("",$context)
$item_7 = GUICtrlCreateMenuItem("Internet",$context)
GUICtrlCreateMenuItem("",$context)
$item_8 = GUICtrlCreateMenuItem("Configure...",$context)
ShowMenu($form,$context)
Switch $result
Case 0
MsgBox(0,"","未选择项目")
Case $item_1
MsgBox(0,"","选择了System32")
Case $item_2
MsgBox(0,"","选择了My Documents")
Case Else
MsgBox(0,"","选择了其它")
EndSwitch
GUIDelete()
Func ShowMenu($hWnd, $nContextID)
Local $moPos = MouseGetPos()
$result=DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", GUICtrlGetHandle($nContextID), "int", 0x0100, "int", $moPos, "int", $moPos, "hwnd", $hWnd, "ptr", 0);弹出菜单
EndFunc ;==>按钮弹出菜单函数
谢了,谢了,太完美了,没想到直接引用返回值来选!思想受限了 good example....... 看不懂啊 。 等高手 解决啊 好东西呀,学习啦
页:
1
[2]