【问题标题】:How do I stop an active AutoHotkey script?如何停止活动的 AutoHotkey 脚本?
【发布时间】:2018-01-23 19:39:21
【问题描述】:

昨天在调试我的 AutoHotkey 脚本时,我不小心触发了 MouseMoveMouseClick 事件的无限循环。每隔 0.5 秒,我的鼠标就会点击屏幕的随机部分。

在尝试使用任务管理器终止 AHK 失败后,我最终关闭了计算机以结束脚本。

如何停止活动的 AutoHotkey 脚本?

【问题讨论】:

    标签: autohotkey


    【解决方案1】:

    添加紧急出口热键

    结束活动脚本的最可靠方法是先发制人地包含紧急ExitApp 热键。一种常见的做法是将以下内容放在任何脚本的底部。

    Esc::ExitApp  ; Exit script with Escape key
    

    您还可以将热键设置为 pausesuspendreload 您的脚本。

    ^!p::Pause    ; Pause script with Ctrl+Alt+P
    ^!s::Suspend  ; Suspend script with Ctrl+Alt+S
    ^!r::Reload   ; Reload script with Ctrl+Alt+R
    

    注销

    在 Windows 10/8/7/Vista 上,您可以使用键盘快捷键 Ctrl+Alt+Delete 快速注销,然后通过 Alt+L

    这是因为按下 Ctrl+Alt+Delete 会打开一个特殊的窗口,该窗口不能被 AutoHotkey 等程序操作。

    以任务栏图标结束

    如果您可以控制键盘和鼠标,您可以通过右键单击任务栏中 AutoHotkey 的绿色 H 图标并选择“退出”来结束脚本

    使用 AHKPanic() 结束所有活动脚本

    为了更通用的解决方案,AHK 用户 None 写了AHKPanic(),这是一个可以暂停、挂起或终止所有其他正在运行的脚本的方法。 (可选地结束调用它的脚本)

    AHKPanic(Kill=0, Pause=0, Suspend=0, SelfToo=0) {
    DetectHiddenWindows, On
    WinGet, IDList ,List, ahk_class AutoHotkey
    Loop %IDList%
      {
      ID:=IDList%A_Index%
      WinGetTitle, ATitle, ahk_id %ID%
      IfNotInString, ATitle, %A_ScriptFullPath%
        {
        If Suspend
          PostMessage, 0x111, 65305,,, ahk_id %ID%  ; Suspend. 
        If Pause
          PostMessage, 0x111, 65306,,, ahk_id %ID%  ; Pause.
        If Kill
          WinClose, ahk_id %ID% ;kill
        }
      }
    If SelfToo
      {
      If Suspend
        Suspend, Toggle  ; Suspend. 
      If Pause
        Pause, Toggle, 1  ; Pause.
      If Kill
        ExitApp
      }
    }
    

    【讨论】:

      【解决方案2】:

      如果您想关闭特定窗口而不执行循环,我创建了以下内容:

      DetectHiddenWindows, On
      
      path = %A_Desktop%\Test.ahk - AutoHotkey v1.1.26.01
      
      path2 = %A_Desktop%\Test2.ahk - AutoHotkey v1.1.26.01
      
      WinClose, %path%
      
      WinClose, %path2%
      

      **注1:**文件名+“-AutoHotKey blah blah blah”(这是打开隐藏在右下角靠近时钟的窗口时的热键窗口名称)

      **注2:**文件名必须区分大小写。

      【讨论】:

      • 创建一个新的 AHK...不要将它添加到以前的 AHK 中。
      【解决方案3】:

      如果您想花哨并从 Windows 命令提示符中停止它,

      停止所有自动热键脚本:

      taskkill /im "autohotkey.exe"
      

      停止特定脚本:

      wmic process where "commandline like '%%MyScript.ahk'" delete
      

      【讨论】:

      • 我非常有兴趣让它发挥作用。我正在尝试获取一个 .bat 脚本来停止运行一个 ahk 脚本表单,但是您的示例“停止特定脚本”似乎不起作用。
      • @KalamalkaKid 确保在命令中包含 %%。因此,如果您的脚本名为 Run.ahk,则该字符串应为“%%Run.ahk”。如果您在命令提示符下键入 wmic process,您将看到所有进程正在运行,包括您的热键脚本,因此您应该能够看到需要调用什么来使其停止。
      • 问题是我不想停止所有脚本我只想停止某个脚本
      • 对,所以无论调用什么脚本,都将其放在单引号之间的字符串中,包括百分号。将我的示例中的 MyScript 替换为 Your Script 的名称。
      • 示例代码在我的回答中。 wmic process where "commandline like '%%MyScript.ahk'" delete 如果它不起作用,可能是其他问题,例如 bat 文件不起作用或权限问题或其他问题。我建议您请朋友、老板或老师帮助您。
      【解决方案4】:

      你也可以让你的脚本#SingleInstance force 并注意“-quit”参数或其他东西。

      #SingleInstance force
      #Persistent
      
      If A_Args[1] == "--stop"
          ExitApp
      
      ; just some random stuff for the script to do
      count := 0
      Loop,
      {
          count++
          Tooltip, %count%
          Sleep, 200
      }
      

      所以你再次运行相同的脚本,但带有参数。 BAM 消失了。

      只是为了完整性。 @Stevoisiak 的回答对于要求的目的已经很好了。?

      【讨论】:

        【解决方案5】:

        我也在寻找如何从另一个自动热键脚本中关闭一个特定的运行脚本,所以我尝试了 cristivaldo 的解决方案,但它对我来说不太有效,所以我对其进行了一些更改。

        我添加了SetTitleMatchMode, 2,因此它将窗口标题与部分匹配项进行匹配,因此您不必完全输入完整的窗口标题(这样即使自动热键版本号更改,它仍然会匹配)。我还删除了路径和变量。

        这是一个停止/关闭特定脚本的示例(只需将 examplescriptfile.ahk 更改为您希望停止的正在运行的自动热键脚本的文件名):

        DetectHiddenWindows, On
        SetTitleMatchMode, 2
        
        WinClose, examplescriptfile.ahk
        

        【讨论】:

          【解决方案6】:

          1.转到 Windows 托盘
          2.右键单击“H”标志
          3.点击“暂停热键”或“退出”

          这是停止自动热键脚本最简单、最简单的方法

          但不要点击暂停脚本,否则重新映射的键将被关闭

          另外,如果您暂停了热键,“H”将变为“S”

          希望这有帮助。

          【讨论】:

            猜你喜欢
            • 2019-07-17
            • 2017-09-15
            • 1970-01-01
            • 1970-01-01
            • 2022-06-15
            • 1970-01-01
            • 2021-08-05
            • 2018-06-28
            • 1970-01-01
            相关资源
            最近更新 更多