检查脚本是否在AutoHotkey中暂停

时间:2013-01-24 01:54:29

标签: scripting autohotkey

我有一个脚本要监视其他2个脚本。基本上,如果监视器脚本看到记事本打开,它将检查脚本1是否被暂停,如果它不执行任何操作,如果它不是暂停脚本1并取消暂停脚本2。

       If (WinExist("ahk_class Notepad") AND (script1 A_IsSuspended = 1)){
            Suspend script2
            un-suspend script1
       }

如何检查其他脚本是否被暂停?

有没有办法将暂停开/关而不是切换到脚本? 这是切换:PostMessage,0x111,65305 ,,, script1.ahk - AutoHotkey

1 个答案:

答案 0 :(得分:3)

暂停或取消暂停其他脚本的唯一方法是:

  • 通过发送菜单命令消息;即切换。
  • 通过实现某种形式的进程间通信(消息传递)并让其他脚本暂停。

但是,在发送切换消息之前,您可以做的是检查脚本是否已暂停。您可以通过检查 Suspend Hotkeys 菜单项是否带有复选标记来执行此操作。

ScriptSuspend(ScriptName, SuspendOn)
{
    ; Get the HWND of the script's main window (which is usually hidden).
    dhw := A_DetectHiddenWindows
    DetectHiddenWindows On
    if scriptHWND := WinExist(ScriptName " ahk_class AutoHotkey")    
    {
        ; This constant is defined in the AutoHotkey source code (resource.h):
        static ID_FILE_SUSPEND := 65404

        ; Get the menu bar.
        mainMenu := DllCall("GetMenu", "ptr", scriptHWND)
        ; Get the File menu.
        fileMenu := DllCall("GetSubMenu", "ptr", mainMenu, "int", 0)
        ; Get the state of the menu item.
        state := DllCall("GetMenuState", "ptr", fileMenu, "uint", ID_FILE_SUSPEND, "uint", 0)
        ; Get the checkmark flag.
        isSuspended := state >> 3 & 1
        ; Clean up.
        DllCall("CloseHandle", "ptr", fileMenu)
        DllCall("CloseHandle", "ptr", mainMenu)

        if (!SuspendOn != !isSuspended)
            SendMessage 0x111, ID_FILE_SUSPEND,,, ahk_id %scriptHWND%
        ; Otherwise, it's already in the right state.
    }
    DetectHiddenWindows %dhw%
}

用法如下:

SetTitleMatchMode 2  ; Allow filename instead of full path.
ScriptSuspend("script1.ahk", true)   ; Suspend.
ScriptSuspend("script1.ahk", false)  ; Unsuspend.

您可以通过将ID_FILE_SUSPEND(65404)替换为ID_FILE_PAUSE(65403)来执行相同的暂停操作。但是,您需要将WM_ENTERMENULOOP(0x211)和WM_EXITMENULOOP(0x212)消息发送到脚本,以便更新暂停脚本复选标记。