为什么窗口在程序运行过程中无法关闭?
#include <WindowsConstants.au3>Global Const $GUI_EVENT_EXIT = -3
Opt("GUIOnEventMode",1)
Global $mainForm=GUICreate("不关闭屏幕及睡眠",200,50,-1,-1,BitOR($WS_CAPTION, $WS_SYSMENU)) ;创建窗口
GUISetOnEvent($GUI_EVENT_EXIT,"EVENT_HANDLE")
$Input = GUICtrlCreateInput("60",10,10,50,20)
GUICtrlCreateLabel("分钟",70,15,40,20)
$btn = GUICtrlCreateButton("开始计时",120,10,60,20)
GUICtrlSetOnEvent($btn,"EVENT_HANDLE")
GUISetState(@SW_SHOW) ;显示窗口
While 1
Sleep(1000)
WEnd
GUIDelete()
Func EVENT_HANDLE()
Switch @GUI_CtrlId
Case $GUI_EVENT_EXIT
Exit
Case $btn
$dis = GUICtrlRead($Input)
For $i =1 To $dis
Local $aPos = MouseGetPos()
MouseMove($apos+10, $apos)
sleep(1000*30)
Local $bPos = MouseGetPos()
MouseMove($bpos-10, $bPos)
Sleep(1000*30)
Next
EndSwitch
EndFunc
点击 开始计时 后,程序能正常运行,但点击窗口的关闭按钮却无法退出?(系统栏程序右键 exit 可以退出) 好好理解 一下吧,sleep是暂停脚本执行,sleep(1000*30) 暂停的时间长度是30秒,程序运行到这一句时,停在那里30秒,不会执行其他语句,到下一句sleep(1000*30)又会暂停30秒。你只有在执行完第一句sleep(1000*30) ,到要执行第二句sleep(1000*30)之前的期间,正好按了关闭,程序才能有反应。这得多难啊! 本帖最后由 yuantian 于 2020-3-23 23:29 编辑
我简单的改了一下,然后还有个问题就是Sleep的时间你还需要重新琢磨一下。。
#include <WindowsConstants.au3>
Global Const $GUI_EVENT_EXIT = -3
Opt("GUIOnEventMode", 1)
Global $mainForm = GUICreate("不关闭屏幕及睡眠", 200, 50, -1, -1, BitOR($WS_CAPTION, $WS_SYSMENU)) ;创建窗口
GUISetOnEvent($GUI_EVENT_EXIT, "EVENT_HANDLE")
$Input = GUICtrlCreateInput("60", 10, 10, 50, 20)
GUICtrlCreateLabel("分钟", 70, 15, 40, 20)
$btn = GUICtrlCreateButton("开始计时", 120, 10, 60, 20)
GUICtrlSetOnEvent($btn, "EVENT_HANDLE")
GUISetState(@SW_SHOW) ;显示窗口
While 1
Sleep(1000)
WEnd
GUIDelete()
Func EVENT_HANDLE()
Opt('GUIOnEventMode', 0)
Switch @GUI_CtrlId
Case $GUI_EVENT_EXIT
Exit
Case $btn
$dis = GUICtrlRead($Input)
For $i = 1 To $dis * 30 * 10
$ts = TimerInit()
Do
Switch GUIGetMsg()
Case -3
Exit
EndSwitch
Until TimerDiff($ts) > 500
Local $aPos = MouseGetPos()
If Mod($i, 100) = 0 Then MouseMove($aPos + 10, $aPos)
Sleep(100)
Local $bPos = MouseGetPos()
If Mod($i, 100) = 50 Then MouseMove($bPos - 10, $bPos)
Sleep(100)
Next
EndSwitch
EndFunc ;==>EVENT_HANDLE
本帖最后由 floor6ggg 于 2020-3-23 23:58 编辑
好久没有水贴了,…………再水多几贴就可以升级了…………
个人感觉是优先级的问题,代码在Case $btn 的时候跳不出循环了………… 论坛很多相关的帖子,仔细体会…………
比如 caodongchun 提到的:如果某些函数还在进行中,要终止他,只能使用比他优先级更高的函数,比如热键,TrayOnEventMode,AdlibEnable 均可达到你的要求
原帖:https://www.autoitx.com/thread-8448-1-1.html 或者是:
lanfengc的解决办法:巧妙利用$Flg=True 来跳出 二级while循环…………
原帖:https://www.autoitx.com/thread-15439-1-1.html 模仿lanfengc的写法,,再水多一贴:
#include <WindowsConstants.au3>
Global Const $GUI_EVENT_EXIT = -3
Opt("GUIOnEventMode",1)
Global $mainForm=GUICreate("不关闭屏幕及睡眠",200,50,-1,-1,BitOR($WS_CAPTION, $WS_SYSMENU)) ;创建窗口
GUISetOnEvent($GUI_EVENT_EXIT,"EVENT_HANDLE")
$Input = GUICtrlCreateInput("60",10,10,50,20)
GUICtrlCreateLabel("分钟",70,15,40,20)
$btn = GUICtrlCreateButton("开始计时",120,10,60,20)
GUICtrlSetOnEvent($btn,"EVENT_HANDLE")
GUISetState(@SW_SHOW) ;显示窗口
Local $Flg=False
While 1
If $Flg=True Then
$dis = GUICtrlRead($Input)
For $i =1 To $dis
Local $aPos = MouseGetPos()
MouseMove($apos+10, $apos)
sleep(10*30)
Local $bPos = MouseGetPos()
MouseMove($bpos-10, $bPos)
Sleep(10*30)
Next
Else
Sleep(200)
EndIf
WEnd
GUIDelete()
Func EVENT_HANDLE()
Switch @GUI_CtrlId
Case $GUI_EVENT_EXIT
Exit
Case $btn
$dis = GUICtrlRead($Input)
$Flg=True
;~ For $i =1 To $dis
;~ Local $aPos = MouseGetPos()
;~ MouseMove($apos+10, $apos)
;~ sleep(10*30)
;~ Local $bPos = MouseGetPos()
;~ MouseMove($bpos-10, $bPos)
;~ Sleep(10*30)
;~ Next
EndSwitch
EndFunc **** Hidden Message *****
#include <WinAPIProc.au3>
_WinAPI_SetThreadExecutionState($iFlags) 谢谢各位。在下编程小白,觉得这种编程思维好难掌握。
页:
[1]