LoginSignup
7
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-01-27

はじめに

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

7
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9