Help us understand the problem. What is going on with this article?

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

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

nezuq
ITエンジニア。仕事や趣味で学んだ事を共有しています。Enjoy Tech! Update World!
https://www.slideshare.net/nezuQ/presentations
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away