邪恶海盗 发表于 2023-9-1 16:17:03

[已解决]如何中断运行中的命令?

本帖最后由 邪恶海盗 于 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

afan 发表于 2023-9-2 11:40:16

邪恶海盗 发表于 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

afan 发表于 2023-9-1 16:28:35

GUIRegisterMsg 注册 WM_COMMAND 消息函数,处理点击

邪恶海盗 发表于 2023-9-1 16:49:30

afan 发表于 2023-9-1 16:28
GUIRegisterMsg 注册 WM_COMMAND 消息函数,处理点击

举个栗子吧,看不懂啊...:face (7):

风过无痕 发表于 2023-9-1 22:33:15

https://www.autoitx.com/thread-46626-1-1.html看下这个帖子

邪恶海盗 发表于 2023-9-2 09:50:42

风过无痕 发表于 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

绿色风 发表于 2023-9-2 10:09:34

可以试下,最直接简单的方法。

就是在你界面上 用个 input ,你每一次循环时,检测这个input里的数字 。如

邪恶海盗 发表于 2023-9-2 10:39:13

绿色风 发表于 2023-9-2 10:09
可以试下,最直接简单的方法。

就是在你界面上 用个 input ,你每一次循环时,检测这个input里的数字 。 ...

关键是程序运行中是无法做其它操作以控制Input的值啊...

绿色风 发表于 2023-9-2 10:41:41

你的for 中,每一次,循环,就去读一下,input的值 。界面再怎么被点用,input是可以输入你想要的东西的。你先试一下说再回说。

邪恶海盗 发表于 2023-9-2 10:54:31

绿色风 发表于 2023-9-2 10:41
你的for 中,每一次,循环,就去读一下,input的值 。界面再怎么被点用,input是可以输入你想要的东西的。 ...

那就跟HotKey一样了,自动运行时是肯定需要有一个检测机制以退出的,但还是要设定一个手动中止的功能...

邪恶海盗 发表于 2023-9-2 13:25:36

本帖最后由 邪恶海盗 于 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


邪恶海盗 发表于 2023-9-2 14:34:31

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

不是小灵通 发表于 2023-9-2 15:40:53

关闭按钮无效,应该是程序暂时执念在for循环内不能自拔吧
是不是可以考虑个办法在循环体内弄个检测点击关闭按钮的语句,但我暂时没弄成功。

afan 发表于 2023-9-2 16:07:03

邪恶海盗 发表于 2023-9-2 14:34
瞎捣鼓用WM_COMMAND好像可以实现了,现在的问题是程序运行时点关闭按钮无效,怎么处理?

我上面的帖子说了,只需要1#的第21行代码 Sleep(1000) 替换成我发的那一段就行了。那是不用系统消息 WM_COMMAND 的方法。

邪恶海盗 发表于 2023-9-2 16:42:13

afan 发表于 2023-9-2 16:07
我上面的帖子说了,只需要1#的第21行代码 Sleep(1000) 替换成我发的那一段就行了。那是不用系统消息 WM_C ...

你这是在打击我学习的积极性么???:face (34):
页: [1] 2
查看完整版本: [已解决]如何中断运行中的命令?