托盘菜单 弹出窗口 如何不暂停脚本!~```[已解决]
本帖最后由 wu5cheng3 于 2013-7-2 22:13 编辑在论坛里搜索到这么一个帖子,不过貌似没解决!
http://www.autoitx.com/forum.php?mod=viewthread&tid=21632&highlight=%CD%D0%C5%CC%2B%D4%DD%CD%A3
自己的代码如下, 当我右键托盘点退出弹出窗口时.循环语句就暂停工作了,函数x()就没有效果了!
;~ Opt("CaretCoordMode", 1) ;1=绝对位置, 0=相对位置, 2=客户区
;~ Opt("ExpandEnvStrings", 0) ;0=不展开, 1=展开
;~ Opt("ExpandVarStrings", 0) ;0=不展开, 1=展开
;~ Opt("GUICloseOnESC", 1) ;1=按下 ESC 将关闭窗口, 0=按下 ESC 将不关闭窗口
;~ Opt("GUICoordMode", 1) ;1=绝对位置, 0=相对位置, 2=单元格
;~ Opt("GUIDataSeparatorChar","|") ;"|"为默认
;~ Opt("GUIOnEventMode", 0) ;0=取消, 1=启用 OnEvent 模式
;~ Opt("GUIResizeMode", 0) ;0=不调整, <1024 特定的调整值
;~ Opt("GUIEventOptions",0) ;0=默认, 1=立即通知, 2=GuiCtrlRead 标签索引
;~ Opt("MouseClickDelay", 10) ;10 毫秒
;~ Opt("MouseClickDownDelay", 10);10 毫秒
;~ Opt("MouseClickDragDelay", 250) ;250 毫秒
;~ Opt("MouseCoordMode", 1) ;1=绝对位置, 0=相对位置, 2=客户区
;~ Opt("MustDeclareVars", 0) ;0=无需声明变量, 1=需要预先声明
;~ Opt("PixelCoordMode", 1) ;1=绝对位置, 0=相对位置, 2=客户区
;~ Opt("SendAttachMode", 0) ;0=不捆绑, 1=捆绑
;~ Opt("SendCapslockMode", 1) ;1=保存并恢复, 0=不保存
;~ Opt("SendKeyDelay", 5) ;5 毫秒
;~ Opt("SendKeyDownDelay", 1) ;1 毫秒
;~ Opt("TCPTimeout",100) ;100 毫秒
;~ Opt("TrayAutoPause",0) ;0=不暂停, 1=暂停
;~ Opt("TrayIconDebug", 0) ;0=无信息, 1=调试信息
;~ Opt("TrayIconHide", 0) ;0=显示, 1=隐藏托盘图标
Opt("TrayMenuMode", 3) ;0=扩展, 1=没有默认菜单, 2=没有自动 check, 4=菜单项目ID 不返回
;~ Opt("TrayOnEventMode",0) ;0=关闭, 1=启用
;~ Opt("WinDetectHiddenText", 0) ;0=不检测, 1=检测
;~ Opt("WinSearchChildren", 1) ;0=不搜索, 1=搜索子窗口
;~ Opt("WinTextMatchMode", 1) ;1=完全匹配, 2=快速匹配
;~ Opt("WinTitleMatchMode", 1) ;1=开头, 2=子串, 3=完全, 4=高级 , -1 to -4=Nocase
;~ Opt("WinWaitDelay", 250) ;250 毫秒
Global Const $GUI_EVENT_CLOSE = -3
Global Const $TRAY_EVENT_PRIMARYDOUBLE = -13
Global Const $TRAY_EVENT_PRIMARYDOWN = -7
Global Const $TRAY_EVENT_SECONDARYDOWN = -9
$gui = GUICreate("标题", 300, 170)
GUISetState()
$2 = TrayCreateItem("退出")
While 1
y()
x()
z()
WEnd
Func y()
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
WinSetState( "标题", "",@SW_HIDE)
EndSelect
EndFunc ;==>y
Func z()
$msg = TrayGetMsg()
Select
Case $msg = $TRAY_EVENT_PRIMARYDOWN
WinSetState( "标题", "",@SW_RESTORE)
Case $msg = $TRAY_EVENT_SECONDARYDOWN
MsgBox(0, "标题", "弹出这个窗口,x()函数就失效了")
TrayItemDelete($2)
Exit
EndSelect
EndFunc ;==>y
Func x()
WinClose("1")
EndFunc ;==>x
Opt("TrayAutoPause", 0);取消自动暂停 回复 2# zldfsz
谢谢解答,这个我之前试过了无效!~ 回复 3# wu5cheng3
真无效吗? 为什么我们的有效呢!Opt("TrayAutoPause", 0)
Opt("TrayMenuMode", 3)
Opt("TrayOnEventMode", 1)
$2 = TrayCreateItem("退出")
TrayItemSetOnEvent(-1, '_exit')
Local $count = 0
While 1
If $count = 5 Then Exit
$count += 1
y()
x()
WEnd
Func y()
MsgBox(0, $count, 'this is y', 3)
EndFunc
Func _exit()
Exit
EndFunc
Func x()
MsgBox(0, $count, 'this is x', 2)
EndFunc 本帖最后由 wu5cheng3 于 2013-7-2 19:58 编辑
回复 4# user3000
用我给出的代码测试一下试试,我这里测试无效.
一个托盘程序,我右键托盘程序弹出菜单(退出) 点选了这个退出出现一个msgbox,此时此刻 在循环语句里面的x() 函数就不运行了(运行我写的代码,新建一个记事本命名为1,你打开就会立即关闭窗口,程序弹出了msgbox对话框后,1.txt记事本就可以正常打开,在循环语句里面执行的函数就没有运行) 回复 5# wu5cheng3
msgbox有阻断程序的功能,inputbox 也类似!
如果像你那样是在响应托盘的命令里运行它,当然就得不到你想要的结果。
你应该用 traytip (或 tooltip 等)替换此命令, 它们不会阻断程序的运行。 回复 6# user3000
非常感谢用户兄台的释义,其实是做个程序必须输入密码才能退出该程序.inputbox这类输入数据函数有阻断程序的功能,这么说是au3目前是无法实现这样的功能吗? 回复 7# wu5cheng3
AU3当然能实现这样的功能。
可以考虑用子窗口来实现密码的输入,子窗口(显示与否)不会像INPUTBOX那样阻断程序的正常运行! 本帖最后由 wu5cheng3 于 2013-7-2 22:11 编辑
回复 8# user3000
再次感谢用户兄台,已解决问题!
Opt("GUIOnEventMode", 1)
Opt("TrayMenuMode", 3)
Global Const $GUI_EVENT_CLOSE = -3
Global Const $TRAY_EVENT_PRIMARYDOUBLE = -13
Global Const $TRAY_EVENT_PRIMARYDOWN = -7
Global Const $TRAY_EVENT_SECONDARYDOWN = -9
$zck = GUICreate("主窗口", 300, 170)
GUISetState()
GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
$2 = TrayCreateItem("退出")
While 1
gui()
tp()
x()
WEnd
Func gui()
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
WinSetState("主窗口", "", @SW_HIDE)
EndSelect
EndFunc ;==>gui
Func tp()
$msg = TrayGetMsg()
Select
Case $msg = $TRAY_EVENT_PRIMARYDOWN
WinSetState("主窗口", "", @SW_RESTORE)
Case $msg = $TRAY_EVENT_SECONDARYDOWN
z()
EndSelect
EndFunc ;==>tp
Func x()
WinClose("1")
EndFunc ;==>x
Func z()
$Form2 = GUICreate("子窗口", 303, 202, -1, -1, -1, -1, $zck)
GUICtrlCreateInput("",10,10,50,20)
GUISetOnEvent($GUI_EVENT_CLOSE, "_exit_z")
GUISetState(@SW_SHOW)
EndFunc ;==>_c_win
Func _exit()
Exit
EndFunc
Func _exit_z()
GUIDelete(@GUI_WinHandle)
EndFunc ;==>_exit_z
终于找到办法解决了 谢谢 终于找到办法解决了 谢谢 学习了........ 我来偷师{:face (239):} 学习一下。 来学习,这是有用的~~~~~~~~~~~~~~~
页:
[1]