找回密码
 加入
搜索
查看: 2041|回复: 9

[网络通信] 为什么窗口在程序运行过程中无法关闭?

[复制链接]
发表于 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[0]+10, $apos[1])
                                sleep(1000*30)
                                Local $bPos = MouseGetPos()
                                MouseMove($bpos[0]-10, $bPos[1])
                                Sleep(1000*30)
                        Next
        EndSwitch
EndFunc


点击 开始计时 后,程序能正常运行,但点击窗口的关闭按钮却无法退出?(系统栏程序右键 exit 可以退出)
发表于 2020-3-24 11:31:57 | 显示全部楼层
好好理解 一下吧,sleep是暂停脚本执行,sleep(1000*30) 暂停的时间长度是30秒,程序运行到这一句时,停在那里30秒,不会执行其他语句,到下一句sleep(1000*30)又会暂停30秒。你只有在执行完第一句sleep(1000*30) ,到要执行第二句sleep(1000*30)之前的期间,正好按了关闭,程序才能有反应。这得多难啊!
发表于 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[0] + 10, $aPos[1])
                                Sleep(100)
                                Local $bPos = MouseGetPos()
                                If Mod($i, 100) = 50 Then MouseMove($bPos[0] - 10, $bPos[1])
                                Sleep(100)
                        Next
        EndSwitch
EndFunc   ;==>EVENT_HANDLE




发表于 2020-3-23 23:49:28 | 显示全部楼层
本帖最后由 floor6ggg 于 2020-3-23 23:58 编辑

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

个人感觉是优先级的问题,代码在  Case $btn 的时候跳不出循环了…………
发表于 2020-3-23 23:51:23 | 显示全部楼层
论坛很多相关的帖子,仔细体会…………
比如   caodongchun 提到的:如果某些函数还在进行中,要终止他,只能使用比他优先级更高的函数,比如热键,TrayOnEventMode,AdlibEnable 均可达到你的要求

原帖:https://www.autoitx.com/thread-8448-1-1.html
发表于 2020-3-23 23:53:16 | 显示全部楼层
或者是:
lanfengc  的解决办法:巧妙利用$Flg=True 来跳出 二级while循环…………

原帖:https://www.autoitx.com/thread-15439-1-1.html
发表于 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[0]+10, $apos[1]) 
                                sleep(10*30) 
                                Local $bPos = MouseGetPos()
                                MouseMove($bpos[0]-10, $bPos[1])
                                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[0]+10, $apos[1]) 
;~                                 sleep(10*30) 
;~                                 Local $bPos = MouseGetPos()
;~                                 MouseMove($bpos[0]-10, $bPos[1])
;~                                 Sleep(10*30)
;~                         Next
        EndSwitch
EndFunc
发表于 2020-3-24 11:24:03 | 显示全部楼层
游客,如果您要查看本帖隐藏内容请回复


评分

参与人数 1金钱 +10 收起 理由
floor6ggg + 10 很给力!

查看全部评分

发表于 2020-3-24 11:38:55 | 显示全部楼层
#include <WinAPIProc.au3>
_WinAPI_SetThreadExecutionState($iFlags)

评分

参与人数 1金钱 +10 收起 理由
floor6ggg + 10 很给力!

查看全部评分

 楼主| 发表于 2020-3-26 12:17:25 | 显示全部楼层
谢谢各位。在下编程小白,觉得这种编程思维好难掌握。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-3-29 05:14 , Processed in 0.083341 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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