找回密码
 加入
搜索
查看: 1416|回复: 29

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

[复制链接]
发表于 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
发表于 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
发表于 2023-9-1 16:28:35 | 显示全部楼层
GUIRegisterMsg 注册 WM_COMMAND 消息函数,处理点击
 楼主| 发表于 2023-9-1 16:49:30 | 显示全部楼层
afan 发表于 2023-9-1 16:28
GUIRegisterMsg 注册 WM_COMMAND 消息函数,处理点击

举个栗子吧,看不懂啊...
发表于 2023-9-1 22:33:15 | 显示全部楼层
 楼主| 发表于 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循环内不能自拔吧
是不是可以考虑个办法在循环体内弄个检测点击关闭按钮的语句,但我暂时没弄成功。
发表于 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 ...

你这是在打击我学习的积极性么???
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-23 02:35 , Processed in 0.173557 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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