[已解决]如何中断运行中的命令?
本帖最后由 邪恶海盗 于 2023-9-4 11:29 编辑RT,假设有这样的代码,按button1后开始改变input1的数据,如何在运行过程中按button2中断执行?
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#region ### START Koda GUI section ### Form=c:\documents and settings\administrator\桌面\form11.kxf
$Form1 = GUICreate("Form1", 500, 200)
$Input1 = GUICtrlCreateInput("Input1", 56, 32, 225, 21)
$Button1 = GUICtrlCreateButton("Button1", 312, 24, 65, 33)
$Button2 = GUICtrlCreateButton("Button2", 400, 24, 73, 33)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
For $n = 1 To 100
Sleep(1000)
GUICtrlSetData($Input1, $n)
Next
Case $Button2
EndSwitch
WEnd
邪恶海盗 发表于 2023-9-1 16:49
举个栗子吧,看不懂啊...
这类例子太多,我都举过不下十个。如果不懂系统消息的话也可以直接在需要跳出的循环中处理,比如将你的 Sleep(1000) 替换为以下:
$ts = TimerInit()
Do
If GUIGetMsg() = $Button2 Then ExitLoop 2
Sleep(10)
If TimerDiff($ts) >= 1000 Then ExitLoop
Until 0 GUIRegisterMsg 注册 WM_COMMAND 消息函数,处理点击 afan 发表于 2023-9-1 16:28
GUIRegisterMsg 注册 WM_COMMAND 消息函数,处理点击
举个栗子吧,看不懂啊...:face (7): https://www.autoitx.com/thread-46626-1-1.html看下这个帖子 风过无痕 发表于 2023-9-1 22:33
https://www.autoitx.com/thread-46626-1-1.html看下这个帖子
感谢指导,试了下使用AdlibUnRegister能实现中断效果,不过AdlibUnRegister注册的函数内部不能用等待函数,如果想等待要怎么处理?
WM_COMMAND这个完全没看懂...
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#region ### START Koda GUI section ### Form=c:\documents and settings\administrator\桌面\form11.kxf
$Form1 = GUICreate("Form1", 500, 200)
$Input1 = GUICtrlCreateInput("Input1", 56, 32, 225, 21)
$Button1 = GUICtrlCreateButton("Button1", 312, 24, 65, 33)
$Button2 = GUICtrlCreateButton("Button2", 400, 24, 73, 33)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
AdlibRegister("start")
Case $Button2
AdlibUnRegister("start")
EndSwitch
WEnd
Func start()
For $n = 1 To 100
If $n = 100 Then AdlibUnRegister("start")
;Sleep(1000)
GUICtrlSetData($Input1, $n)
Next
EndFunc ;==>start 可以试下,最直接简单的方法。
就是在你界面上 用个 input ,你每一次循环时,检测这个input里的数字 。如
绿色风 发表于 2023-9-2 10:09
可以试下,最直接简单的方法。
就是在你界面上 用个 input ,你每一次循环时,检测这个input里的数字 。 ...
关键是程序运行中是无法做其它操作以控制Input的值啊... 你的for 中,每一次,循环,就去读一下,input的值 。界面再怎么被点用,input是可以输入你想要的东西的。你先试一下说再回说。 绿色风 发表于 2023-9-2 10:41
你的for 中,每一次,循环,就去读一下,input的值 。界面再怎么被点用,input是可以输入你想要的东西的。 ...
那就跟HotKey一样了,自动运行时是肯定需要有一个检测机制以退出的,但还是要设定一个手动中止的功能... 本帖最后由 邪恶海盗 于 2023-9-2 13:48 编辑
afan 发表于 2023-9-2 11:40
这类例子太多,我都举过不下十个。如果不懂系统消息的话也可以直接在需要跳出的循环中处理,比如将你的 S ...
爬到你之前的一个帖子,用GUIOnEventMode搞定了,我再爬爬WM_COMMAND看看哪个更方便
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#region ### START Koda GUI section ### Form=c:\documents and settings\administrator\桌面\form11.kxf
Opt('GUIOnEventMode', 1)
$Form1 = GUICreate("Form1", 500, 200)
GUISetOnEvent(-3, '_Close')
$Input1 = GUICtrlCreateInput("Input1", 56, 32, 225, 21)
$Button1 = GUICtrlCreateButton("开始", 312, 24, 65, 33)
GUICtrlSetOnEvent(-1, '_Start')
$Button2 = GUICtrlCreateButton("停止", 400, 24, 73, 33)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
While 1
Sleep(1000)
WEnd
Func _Start()
Opt('GUIOnEventMode', 0)
GUICtrlSetData($Button1, '正在运行')
GUICtrlSetState($Button1, $GUI_DISABLE)
GUICtrlSetState($Input1, $GUI_DISABLE)
For $n = 1 To 10
$ts = TimerInit()
Do
Switch GUIGetMsg()
Case -3
_Close()
Case $Button2
ExitLoop 2
EndSwitch
GUICtrlSetData($Input1, $n)
Until TimerDiff($ts) > 500
Next
GUICtrlSetData($Button1, '开始')
GUICtrlSetState($Button1, $GUI_ENABLE)
GUICtrlSetState($Input1, $GUI_ENABLE)
Opt('GUIOnEventMode', 1)
EndFunc ;==>_Start
Func _Close()
Exit
EndFunc ;==>_Close
afan 发表于 2023-9-2 11:40
这类例子太多,我都举过不下十个。如果不懂系统消息的话也可以直接在需要跳出的循环中处理,比如将你的 S ...
瞎捣鼓用WM_COMMAND好像可以实现了,现在的问题是程序运行时点关闭按钮无效,怎么处理?
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#region ### START Koda GUI section ### Form=c:\documents and settings\administrator\桌面\form11.kxf
Global $StopCode
$Form1 = GUICreate("Form1", 500, 200)
$Input1 = GUICtrlCreateInput("Input1", 56, 32, 225, 21)
$Button1 = GUICtrlCreateButton("Button1", 312, 24, 65, 33)
$Button2 = GUICtrlCreateButton("Button2", 400, 24, 73, 33)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
$StopCode = 0
GUICtrlSetData($Button1, '开始')
GUICtrlSetData($Button1, '正在运行')
GUICtrlSetState($Button1, $GUI_DISABLE)
GUICtrlSetState($Input1, $GUI_DISABLE)
For $n = 1 To 10
If $StopCode = 1 Then ExitLoop
$ts = TimerInit()
Do
GUICtrlSetData($Input1, $n)
Until TimerDiff($ts) > 500
Next
GUICtrlSetData($Button1, '开始')
GUICtrlSetState($Button1, $GUI_ENABLE)
GUICtrlSetState($Input1, $GUI_ENABLE)
EndSwitch
WEnd
Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)
Local $hWndFrom, $iIDFrom, $iCode, $iIDFrom1
Switch BitAND(0xffff, $wParam)
Case $Button2
$StopCode = 1
EndSwitch
EndFunc ;==>WM_COMMAND
关闭按钮无效,应该是程序暂时执念在for循环内不能自拔吧
是不是可以考虑个办法在循环体内弄个检测点击关闭按钮的语句,但我暂时没弄成功。 邪恶海盗 发表于 2023-9-2 14:34
瞎捣鼓用WM_COMMAND好像可以实现了,现在的问题是程序运行时点关闭按钮无效,怎么处理?
我上面的帖子说了,只需要1#的第21行代码 Sleep(1000) 替换成我发的那一段就行了。那是不用系统消息 WM_COMMAND 的方法。 afan 发表于 2023-9-2 16:07
我上面的帖子说了,只需要1#的第21行代码 Sleep(1000) 替换成我发的那一段就行了。那是不用系统消息 WM_C ...
你这是在打击我学习的积极性么???:face (34):
页:
[1]
2