Edited at

VBScriptでProcessIDからHWNDを取得する。

More than 3 years have passed since last update.


はじめに

VBScriptでは、「CreateObject("WScript.Shell").Exec(EXEのパス名)」で他のEXEを起動する事ができます。

しかし、画面の最大化・最小化表示、最前面への移動など、EXEを操作する為のメソッドはあまり用意されていません。

そのため、ExecuteExcel4Macro/Callを通してWindowsAPIにHWNDを渡し、自動操作を実現したい所です。

しかし、Execで取得できるオブジェクトのメンバーにはProcessIDしかありません。

そこで、ProcessIDからHWNDを取得するコードを公開致します。


コード


PID2HWND.vbs

'EXCELオブジェクトを用意する

Set excel = WScript.CreateObject("Excel.Application")

'HWNDをプロセスIDで取得する
Private Function GetHWNDByPID(pId)
Dim hwnd, pIdLast
hwnd = excel.ExecuteExcel4Macro("CALL(""user32"", ""GetDesktopWindow"", ""J"")")
hwnd = excel.ExecuteExcel4Macro("CALL(""user32"", ""GetWindow"", ""JJJ"", " & CStr(hwnd) & ", 5)")
GetHWNDByPID = 0
Do While (0 <> hwnd)
pIdLast = GetPIDByHWND(hwnd)
If (pId = pIdLast) Then
GetHWNDByPID = hwnd
Exit Do
End If
hwnd = excel.ExecuteExcel4Macro("CALL(""user32"", ""GetWindow"", ""JJJ"", " & CStr(hwnd) & ", 2)")
Loop
End Function

'HWNDからプロセスIDを取得する
Private Function GetPIDByHWND(hwnd)
GetPIDByHWND = excel.ExecuteExcel4Macro("CALL(""user32"", ""GetWindowThreadProcessId"", ""2JN"", " & CStr(hwnd) & ", 0)")
End Function


引用元:PaperTester/PaperTester.vbs at master · nezuQ/PaperTester


備考

ExecuteExcel4Macro/CALLの3番目の引数(ex.JJJ)は「返り値・引数1・引数2……」のデータ型を表しているそうです。返り値の部分を数字にする事で、指定のインデックスの引数に格納された値が返ってくるようになります。参照型(ByRef)の引数はこれで対応できます。


おまけ

SendKeysでのショートカット操作やシェルコマンドを通じた日本語文字列のコピー&ペーストなど、EXEを操作するコードは下記のライブラリに記載しています。

nezuQ/PaperTester - Excelテスト仕様書からIE/EXE自動操作用のVBScriptコードを自動生成する。