VBAでWindowsAPIを用いてウインドウを取得する手順について

スポンサーリンク

WindowsAPIでのウインドウ取得には色々な手順がある

前回はウインドウの取得によく使われるWindowsAPIの関数とウインドウのプロパティを紹介しました。
これらのWindowsAPIの関数は機能が重複しているようで、ウインドウの取得に関してたくさんのアプローチがあります。

今回はこのWindowsAPIを使用して効率よくウインドウを取得する手順をいくつか紹介します。

ウインドウの取得手順

ウインドウを取得する(=操作対象として確定する)のはウインドウハンドルを取得するのが基本となります。
ウインドウハンドルを取得できれば、最前面に表示してアクティブにもできますし、キーボードやマウスでの操作も可能になります。

AppAtivateメソッドをキャプション名を引数に入れて実行してもウインドウを最前面にすることはできますが、その他の操作にはやはりウインドウハンドルを取得しておいた方が融通が利きます。

ここでは実際よく起こる下記のような条件の場合のウインドウを取得する手順についてご紹介します。

①キャプション名がわかっている場合

WindowsAPIを使用する場合、キャプション名を指定した「FindWindow」関数でウインドウハンドルを取得します。

Declare Function FindWindow Lib “user32” Alias “FindWindowA” _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Sub キャプション名からウインドウハンドルを取得する()

Dim hWnd As Long
hWnd = FindWindow(vbNullString, “キャプション名”)

End Sub

②クラス名がわかっている場合

同じクラス名のウインドウが他になければFindWindow(“クラス名”,vbNullString)で取得します。
他に同じクラス名のウインドウがある場合、クラス名が不明の下記④の手順でウインドウハンドルを取得します。

Declare Function FindWindow Lib “user32” Alias “FindWindowA” _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Sub クラス名からウインドウハンドルを取得する()

Dim hWnd As Long
hWnd = FindWindow(“OpusApp”, vbNullString)

End Sub

③クラス名不明・キャプション名は一部だけわかる

まず、クラス名・キャプション名をVbNullStringに指定してFindWindow関数を使用することで最初のウインドウを取得します。
続けてそこからGetNextWindow関数で順番に最後までウインドウハンドルを取得します。

ウインドウハンドル一覧を取得すると当時にGetWindowText関数を用いてウインドウハンドルに対するキャプション名を取得し、あらかじめわかっていたキャプション名の一部を照合して該当のウインドウハンドルを取得します。

下記の例ではGoogleChromeのウインドウハンドルを取得する手順を記載しています。
GoogleChromeはキャプション名が見えませんが、「Chrome」の文字で認識をかけることでウインドウハンドルを取得しています。

また、GetClassNameを使用すればキャプション名の全体を取得することも可能です。

’ウインドウハンドルを取得する
Declare Function FindWindow Lib “user32” Alias “FindWindowA” _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

’ウインドウのキャプションタイトルを取得する
Declare Function GetWindowText Lib “user32” Alias “GetWindowTextA” _
(ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

’ウインドウが可視かどうかを取得する
Declare Function IsWindowVisible Lib “user32” (ByVal hWnd As Long) As Long

’次または前のウインドウハンドルを取得する
Declare Function GetNextWindow Lib “user32” Alias “GetWindow” _
(ByVal hWnd As Long, ByVal wFlag As Long) As Long

Const GW_HWNDLAST = 1
Const GW_HWNDNEXT = 2

Sub キャプション名の一部からウインドウハンドルを取得する()

Dim hWnd As Long
Dim strCaption As String * 80
Dim 対象ウインドウハンドル As Long

hWnd = FindWindow(vbNullString, vbNullString) ’1つめのウインドウを取得する
Do
If IsWindowVisible(hWnd) Then
GetWindowText hWnd, strCaption, Len(strCaption)
If InStr(strCaption, “Chrome”) <> 0 Then
対象ウインドウハンドル = hWnd
Exit Do
End If
End If
hWnd = GetNextWindow(hWnd, GW_HWNDNEXT)
Loop Until hWnd = GetNextWindow(hWnd, GW_HWNDLAST) ’最後のウインドウになるまで繰り返す

End Sub

キャプション名、クラス名いずれも全く見当がつかない場合、一覧を書き出してみて確認する方法もあります。
ウインドウのキャプション名・クラス名の一覧表を作成するVBAコードはまた別の機会に紹介します。

おすすめ書籍 (広告)

コメント