3

他の2つのスクリプトを監視したい1つのスクリプトがあります。基本的に、モニタースクリプトはメモ帳が開いていることを確認すると、script1が一時停止されているかどうかを確認し、そうでない場合は何もしません。そうでない場合は、script1を一時停止し、script2の一時停止を解除します。

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

他のスクリプトが一時停止されているかどうかを確認するにはどうすればよいですか?

スクリプトへの切り替えの代わりにサスペンドのオン/オフを送信する方法はありますか?これはトグルです:PostMessage、0x111、65305 、、、script1.ahk-AutoHotkey

4

1 に答える 1

4

別のスクリプトを一時停止または一時停止解除する唯一の方法は次のとおりです。

  • メニューコマンドメッセージを送信する。つまり、トグルします。
  • 何らかの形式のプロセス間通信(メッセージパッシング)を実装し、他のスクリプトを一時停止させることによって。

ただし、できることは、トグルメッセージを送信する前に、スクリプトが一時停止されているかどうかを確認することです。これを行うには、[ホットキーの一時停止]メニュー項目にチェックマークが付いているかどうかを確認します。

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)メッセージをスクリプトに送信する必要があります。

于 2013-08-13T08:46:25.793 に答える