找回密码
 加入
搜索
楼主: happytc

[AU3基础] 如何创建这样的菜单?

 火.. [复制链接]
发表于 2011-3-6 13:20:50 | 显示全部楼层
如果函数调用失败,将会设置 @error 为 1. 否则返回包含函数返回值和所有参数副本的数组
(包括可能被传递参数时修改的函数参数).
$return[0] = 函数返回值
$return[1] = 参数 1
$return[2] = 参数 2
...
$return[n] = 参数 n

帮助文档中对dllcall的说明,$return[0]是函数的返回值
 楼主| 发表于 2011-3-8 00:05:16 | 显示全部楼层
回复 15# 飘云

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

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

反正不管在Switch里有没有执行,出了Switch后,都得删掉那个gui窗口的。
 楼主| 发表于 2011-3-8 11:05:22 | 显示全部楼层
回复 17# happytc

这样做还是有问题:虽然gui已经删了,但永远在while循环里了。
目的是想,当菜单出来后,不管是选了菜单项目,还是点别的地方后菜单消失,都退出程序(若把它写成函数,就退出函数,因为这个菜单功能,只是整个程序的一个功能而已),只想用热键呼出这个菜单。
发表于 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消息)
 楼主| 发表于 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[1]
$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[0]
                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[0], "int", $moPos[1], "hwnd", $hWnd, "ptr", 0);弹出菜单
EndFunc   ;==>按钮弹出菜单函数

发表于 2011-3-8 13:22:08 | 显示全部楼层
既然$result[0]有返回标识符,那么直接用$result[0]不就行了=。=
发表于 2011-3-8 13:30:06 | 显示全部楼层
本帖最后由 飘云 于 2011-3-8 13:34 编辑

另外,如果只是想要点一下就消失的话,其实是不用循环的,循环的作用是保留GUI,你只是需要一个功能选择,选完关闭的效果,那么循环就没意义了,当菜单处于弹出状态时,脚本是被暂停的

#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $result[1]
$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[0]
        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[0], "int", $moPos[1], "hwnd", $hWnd, "ptr", 0);弹出菜单
EndFunc   ;==>按钮弹出菜单函数

 楼主| 发表于 2011-3-8 13:57:57 | 显示全部楼层
谢了,谢了,太完美了,没想到直接引用返回值来选!思想受限了
发表于 2011-3-17 14:53:35 | 显示全部楼层
good example.......
发表于 2011-3-26 13:33:18 | 显示全部楼层
看不懂啊 。
发表于 2011-3-26 13:33:36 | 显示全部楼层
等高手 解决啊
发表于 2011-7-7 10:09:47 | 显示全部楼层
好东西呀,学习啦
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-29 18:57 , Processed in 0.071271 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表