blechmusikの日記

キー・カスタマイズ・ソフトウェア "DvorakJ" の覚え書きをはじめとして様々なことを書いています。

最前面のウィンドウのプロセスを取得し、そのアプリケーションのパスを抜き出すスクリプト

ComObjGet() の例をもとに、表題のとおり動作するスクリプトを作成してみた。[Shift]+ [ESC] で当該情報を取得し、その情報を表示する。以下の画像は、EmEditorAutoHotkey のスクリプトを編集しているときに、以下のスクリプトを動作させてプロセスを取得した様子を示している。

SplitPath - AutoHotkeyJpStringSplit - AutoHotkeyJpを用いるようこのスクリプトを少々改変すれば、異なる場所から起動した諸アプリケーションについて、AutoHotkey が別の振る舞いをすることができるようになる。同じドライブでなくても構わない。たとえば、一つは C ドライブ内からであり、もう一つは F ドライブの USB メモリ内からであっても構わないのだ。
このスクリプトをさらに発展させれば、引数として与えられているファイルそのものを別のアプリケーションで開き直すことができる。上記の画像中に示されている "GetProcessInfo.ahk" をメモ帳で開くよう処理することもできるわけだ。
AutoHotkey で COM を使用できることがこれほど魅力的なものだとは、考えていなかった。

#SingleInstance, Force

;;; ComObjGet()
;;; http://www.autohotkey.net/~Lexikos/AutoHotkey_L/docs/commands/ComObjGet.htm


; Example: Press Shift+Escape to show the command line which was used
;   to launch the active window's process.  Requires XP or later.
+Esc::
    WinGet pid, PID, A
    ; Get WMI service object.
    wmi := ComObjGet("winmgmts:")
    ; Run query to retrieve matching process(es).
    queryEnum := wmi.ExecQuery(""
        . "Select * from Win32_Process where ProcessId=" . pid)
        ._NewEnum()
    ; Get first matching process.
    if queryEnum[process]
        MsgBox 0, active window`'s process, % GetProcess( process.CommandLine ) "`n" process.CommandLine
    else
        MsgBox Process not found!
    ; Free all global objects (not necessary when using local vars).
    wmi := queryEnum := process := ""
return
; Win32_Process: http://msdn.microsoft.com/en-us/library/aa394372.aspx


GetProcess(command_line)
{
	RegExMatch(command_line, """(.+?)""", $, 1)
	return $1
}