飘云 发表于 2011-3-6 13:20:50

如果函数调用失败,将会设置 @error 为 1. 否则返回包含函数返回值和所有参数副本的数组
(包括可能被传递参数时修改的函数参数).
$return = 函数返回值
$return = 参数 1
$return = 参数 2
...
$return = 参数 n

帮助文档中对dllcall的说明,$return是函数的返回值

happytc 发表于 2011-3-8 00:05:16

回复 15# 飘云

谢你的热情回答。把TrackPopupMenuEx函数的第二个参数设为0x0100了,不知为什么,guiGetMsg()函数得到的值永远是-11,也就是不会执行你鼠标选择菜单的东西了。

不过,我在EndSwitch后面加一行GUIDelete()就可以解决我在14楼提出的问题了。

反正不管在Switch里有没有执行,出了Switch后,都得删掉那个gui窗口的。

happytc 发表于 2011-3-8 11:05:22

回复 17# happytc

这样做还是有问题:虽然gui已经删了,但永远在while循环里了。
目的是想,当菜单出来后,不管是选了菜单项目,还是点别的地方后菜单消失,都退出程序(若把它写成函数,就退出函数,因为这个菜单功能,只是整个程序的一个功能而已),只想用热键呼出这个菜单。

devil3380 发表于 2011-3-8 11:09:59

又学习了一招嘿嘿

飘云 发表于 2011-3-8 13:00:08

本帖最后由 飘云 于 2011-3-8 13:06 编辑

LZ你还是没仔细看关于TrackPopupMenuEx函数的说明呀,
TPM_RETURNCMD;若设置此标志;函数将用户所选菜单项的标识符返回到返回值里。
(补充:当TrackPopupMenu的返回值大于0,就说明用户从弹出菜单中选择了一个菜单。以返回的ID号为参数wParam的值,程序给自己发送了一个WM_SYSCOMMAND消息)

happytc 发表于 2011-3-8 13:12:24

回复 20# 飘云

关键是你在15楼那样的,是可以得TrackPopupMenuEx的返回值,但GUIGetMsg()得到的值不对呀,永远都是-11. 从而15楼的代码没法执行到while里的MsgBox(0,0,"0k")呀

飘云 发表于 2011-3-8 13:21:26


#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   ;==>按钮弹出菜单函数

飘云 发表于 2011-3-8 13:22:08

既然$result有返回标识符,那么直接用$result不就行了=。=

飘云 发表于 2011-3-8 13:30:06

本帖最后由 飘云 于 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   ;==>按钮弹出菜单函数

happytc 发表于 2011-3-8 13:57:57

谢了,谢了,太完美了,没想到直接引用返回值来选!思想受限了

hkc5599 发表于 2011-3-17 14:53:35

good example.......

smokewu 发表于 2011-3-26 13:33:18

看不懂啊 。

smokewu 发表于 2011-3-26 13:33:36

等高手 解决啊

hpdeskjet 发表于 2011-7-7 10:09:47

好东西呀,学习啦
页: 1 [2]
查看完整版本: 如何创建这样的菜单?