はじめに
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コードを自動生成する。