Process
実行制御 | GUI表示 | 演算・変数 | メモリ・DLL操作 | 文字列操作 |
キーボード | マウス | シェル | ウィンドウ | ウィンドウグループ
ステータスバー | コントロール | サウンド | ファイル | INIファイル |
レジストリ | 環境変数 | AutoHotkey | その他 | 設定関係 | オブジェクト
Process[編集]
特定のプロセスが存在するかチェックしたり、優先度を変更したり、終了させたりする。
Process, Exist, PID-or-Name Process, Close, PID-or-Name Process, Priority, PID-or-Name, NewPriority Process, Wait, PID-or-Name, Seconds Process, WaitClose, PID-or-Name, Seconds
Parameters[編集]
引数名 | 説明 | |
---|---|---|
Cmd | 以下のコマンド名のどれかを指定。 | |
Exist | PID-or-Nameで指定したプロセスが存在すれば、ErrorLevel にPIDが格納される。 PID-or-Nameが省略された場合は、スクリプト自身のPIDが格納される。 単一行でスクリプト自身のPIDを得たい場合は以下のようにする。 PID := DllCall("GetCurrentProcessId") | |
Close | プロセスを終了する。終了に成功した場合は該当するプロセスIDがErrorLevelに格納され、失敗した場合は 0 となる。実行中のプロセスはその場で終了させられるので、セーブされていないデータのロスが生じたりする可能性がある。アプリケーションの終了は WinClose を利用するのが望ましく、それでもダメな時のみ本コマンドを利用するようにすること。 | |
List | 定義されているが動作しない。ページ下部の DllCall を利用した一覧を取得する例を参考。
| |
Priority | プロセスの優先度を変更する。 第2引数を省略することで、AutoHotkey自身のプロセス優先度を変更できる。 第3引数に設定したい優先度を指定する。 優先度は以下のどれか。頭文字一文字の省略形でもよい。
| |
Wait | 第3引き数で指定した秒数(小数も可能)まで、一致するプロセスが存在するようになるのを待つ。 第3引き数が省略された場合、プロセスが存在するようになるまで無限に待つ。 プロセスが見つかった場合は、ErrorLevel にPIDが格納される。 指定時間が経過した場合は、 0 になる。
| |
WaitClose | 第3引き数で指定した秒数(小数も可能)まで、一致するプロセスが一つも存在しなくなるのを待つ。 第3引き数が省略された場合、プロセスが存在するようになるまで無限に待つ。 指定時間が経過しても一致するプロセスが残っていた場合、ErrorLevelに一致する最初のプロセスのPIDが入る。 プロセスが存在しなくなった場合、ErrorLevelは 0 になる。
| |
PID-or-Name | プロセスIDかプロセス名を指定する。数値の場合はPIDとみなす。 | |
プロセスID | プロセス起動時に割り振られる固有の番号。 RunやWinGet、Processコマンドで取得できる。 | |
プロセス名 | 多くの場合、プロセス名は実行ファイル名と同じになる。タスクマネージャに表示されているものと同じでディレクトリは含まない。 複数の名前が一致するプロセスがあった場合、最初の一つが対象となる。 |
ErrorLevel[編集]
PID-or-Nameにマッチするプロセスが見つかり、処理に成功した場合は、そのプロセスのPIDになる。
プロセスが見つからなかったり、処理に失敗した場合は、 0
になる。
コマンドがWaitCloseの場合のみ、指定時間が経過しても一致するプロセスが残っていた場合そのプロセスのPIDになり、プロセスが存在しなくなった場合、 0
になる。
Remarks[編集]
WaitとWaitCloseは、100ミリ秒ごとに指定プロセスの存在をチェックする。条件を満たしたら即座に待機を終了し、ErrorLevelを変更し、スクリプトの次の行の実行に移る。待機している間は、他のスレッドが割り込むことができる。
WindowsNT4.0でこのコマンドを実行するには、PSAPI.DLL(AutoHotkeyに同梱)が必要。
Related[編集]
Run, WinGet, WinClose, WinKill, WinWait, WinWaitClose, IfWinExist
Example(s)[編集]
例1: メモ帳を起動し、優先度を「高」にする。
Run Notepad.exe, , , NewPID Process, Priority, %NewPID%, High MsgBox, 新たに起動したメモ帳のプロセスIDは %NewPID% 。
例2: メモ帳のプロセスを検索し、見つかったら色々と操作をする。
Process, wait, Notepad.exe, 5.5 NewPID = %ErrorLevel%; ErrorLevelは頻繁に変更されるので変数に代入しておく
If NewPID = 0 { MsgBox, 5.5秒の間に指定のプロセスが見つからなかった。 Return }; 見つかった場合
MsgBox, プロセスを発見((プロセスID = %NewPID%) Process, Priority, %NewPID%, Low Process, Priority, , High; 優先度を「高」にする
WinClose 無題 - メモ帳 Process, WaitClose, %NewPID%, 5 If (ErrorLevel != 0); 指定プロセスがまだ存在している場合
MsgBox, 該当プロセスが5秒を経過しても閉じなかった
例3: ホットキーでアクティブウィンドウのプロセスの優先度を変更する。
#z::; [Win]+[Z] に割り当て
WinGet, active_pid, PID, A WinGetTitle, active_title, A Gui, 5:Add, Text,, [Esc]でキャンセル、ダブルクリックで以下のウィンドウの優先度を変更`n%active_title% Gui, 5:Add, ListBox, vMyListBox gMyListBox r5, Normal|High|Low|BelowNormal|AboveNormal Gui, 5:Add, Button, default, OK Gui, 5:Show,, Set Priority Return 5GuiEscape: 5GuiClose: Gui, Destroy Return MyListBox: If (A_GuiControlEvent != "DoubleClick") Return; 次のサブルーチンラベルもスルーして実行:
5ButtonOK: GuiControlGet, MyListBox Gui, Destroy Process, Priority, %active_pid%, %MyListBox% If (ErrorLevel = 0) MsgBox,, エラー, 優先度の「%MyListBox%」への変更に失敗 Else MsgBox,, 成功 , 優先度を「%MyListBox%」に変更 Return
例4: DllCallを利用して実行中のプロセス一覧を取得し、メッセージボックスに表示する
d := " | "; string separator
s := 4096; size of buffers and arrays (4 KB)
Process, Exist; sets ErrorLevel to the PID of this running script
; Get the handle of this script with PROCESS_QUERY_INFORMATION (0x0400)
h := DllCall("OpenProcess", "UInt", 0x0400, "Int", false, "UInt", ErrorLevel, "Ptr"); Open an adjustable access token with this process (TOKEN_ADJUST_PRIVILEGES = 32)
DllCall("Advapi32.dll\OpenProcessToken", "Ptr", h, "UInt", 32, "PtrP", t) VarSetCapacity(ti, 16, 0); structure of privileges
NumPut(1, ti, 0, "UInt"); one entry in the privileges array...
; Retrieves the locally unique identifier of the debug privilege:
DllCall("Advapi32.dll\LookupPrivilegeValue", "Ptr", 0, "Str", "SeDebugPrivilege", "Int64P", luid) NumPut(luid, ti, 4, "Int64") NumPut(2, ti, 12, "UInt"); enable this privilege: SE_PRIVILEGE_ENABLED = 2
; Update the privileges of this process with the new access token:
r := DllCall("Advapi32.dll\AdjustTokenPrivileges", "Ptr", t, "Int", false, "Ptr", &ti, "UInt", 0, "Ptr", 0, "Ptr", 0) DllCall("CloseHandle", "Ptr", t); close this access token handle to save memory
DllCall("CloseHandle", "Ptr", h); close this process handle to save memory
hModule := DllCall("LoadLibrary", "Str", "Psapi.dll"); increase performance by preloading the library
s := VarSetCapacity(a, s); an array that receives the list of process identifiers:
c := 0; counter for process idendifiers
DllCall("Psapi.dll\EnumProcesses", "Ptr", &a, "UInt", s, "UIntP", r) Loop, % r // 4; parse array for identifiers as DWORDs (32 bits):
{ id := NumGet(a, A_Index * 4, "UInt"); Open process with: PROCESS_VM_READ (0x0010) | PROCESS_QUERY_INFORMATION (0x0400)
h := DllCall("OpenProcess", "UInt", 0x0010 | 0x0400, "Int", false, "UInt", id, "Ptr") If !h Continue VarSetCapacity(n, s, 0); a buffer that receives the base name of the module:
e := DllCall("Psapi.dll\GetModuleBaseName", "Ptr", h, "Ptr", 0, "Str", n, "UInt", A_IsUnicode ? s//2 : s) If !e; fall-back method for 64-bit processes when in 32-bit mode:
If e := DllCall("Psapi.dll\GetProcessImageFileName", "Ptr", h, "Str", n, "UInt", A_IsUnicode ? s//2 : s) SplitPath n, n DllCall("CloseHandle", "Ptr", h); close process handle to save memory
If (n && e); if image is not null add to list:
l .= n . d, c++ } DllCall("FreeLibrary", "Ptr", hModule); unload the library to free memory
;Sort, l, C ; uncomment this line to sort the list alphabetically
MsgBox, 0, %c% Processes, %l%
例5: COMを利用してプロセス一覧を得る。MSDNを参照。
Gui, Add, ListView, x2 y0 w400 h500, Process Name|Command Line For process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process") LV_Add("", process.Name, process.CommandLine) Gui, Show,, Process List