別のスクリプトを一時停止または一時停止解除する唯一の方法は次のとおりです。
- メニューコマンドメッセージを送信する。つまり、トグルします。
- 何らかの形式のプロセス間通信(メッセージパッシング)を実装し、他のスクリプトを一時停止させることによって。
ただし、できることは、トグルメッセージを送信する前に、スクリプトが一時停止されているかどうかを確認することです。これを行うには、[ホットキーの一時停止]メニュー項目にチェックマークが付いているかどうかを確認します。
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)メッセージをスクリプトに送信する必要があります。