ligenlin 发表于 2020-3-23 18:16:29

为什么窗口在程序运行过程中无法关闭?

#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 可以退出)

shqf 发表于 2020-3-24 11:31:57

好好理解 一下吧,sleep是暂停脚本执行,sleep(1000*30) 暂停的时间长度是30秒,程序运行到这一句时,停在那里30秒,不会执行其他语句,到下一句sleep(1000*30)又会暂停30秒。你只有在执行完第一句sleep(1000*30) ,到要执行第二句sleep(1000*30)之前的期间,正好按了关闭,程序才能有反应。这得多难啊!

yuantian 发表于 2020-3-23 23:26:03

本帖最后由 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:49:28

本帖最后由 floor6ggg 于 2020-3-23 23:58 编辑

好久没有水贴了,…………再水多几贴就可以升级了…………

个人感觉是优先级的问题,代码在Case $btn 的时候跳不出循环了…………

floor6ggg 发表于 2020-3-23 23:51:23

论坛很多相关的帖子,仔细体会…………
比如   caodongchun 提到的:如果某些函数还在进行中,要终止他,只能使用比他优先级更高的函数,比如热键,TrayOnEventMode,AdlibEnable 均可达到你的要求

原帖:https://www.autoitx.com/thread-8448-1-1.html

floor6ggg 发表于 2020-3-23 23:53:16

或者是:
lanfengc的解决办法:巧妙利用$Flg=True 来跳出 二级while循环…………

原帖:https://www.autoitx.com/thread-15439-1-1.html

floor6ggg 发表于 2020-3-23 23:56:26

模仿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

zghwelcome 发表于 2020-3-24 11:24:03

**** Hidden Message *****

afan 发表于 2020-3-24 11:38:55

#include <WinAPIProc.au3>
_WinAPI_SetThreadExecutionState($iFlags)

ligenlin 发表于 2020-3-26 12:17:25

谢谢各位。在下编程小白,觉得这种编程思维好难掌握。
页: [1]
查看完整版本: 为什么窗口在程序运行过程中无法关闭?