WindowsAPIを用いてウインドウの一覧表を作成するVBAコード

スポンサーリンク

ウインドウのクラス名やキャプション名が取得できれば色々便利

ウインドウ操作をする際、対象となるウインドウを特定するにはウインドウハンドルを用いるのが一般的です。

このウインドウハンドルはウインドウごとの固有の値になりますが、開くたびに新しい値が割り振られるため、操作の度、毎回確認する必要があります。
そのためウインドウハンドルを取得する前段階としてクラス名・キャプション名を把握しておく必要があります。

厳密にはこちらの記事に書いたようにどちらか片方の一部だけでも取得していれば繰り返し処理などでウインドルハンドルを取得できるのですが、コードが煩雑になったりわかりにくくなります。

今回は簡単にウインドウ取得に役立てられるクラス名・キャプション名一覧表を取得するVBAコードをご紹介します。

クラス名・キャプション名とは

Windows上で開いているウインドウはすべてウインドウハンドル・クラス名・キャプション名などのプロパティを持っています。

詳しくはこちらの記事でご紹介しましたが、クラス名はアプリケーションごとに固有の文字列、キャプション名はアプリケーションごとに異なり、ファイル名とアプリケーション名のどちらかまたは組み合わせの文字列です。

ウインドウハンドルはウインドウを開くたびに固有に割り振られる数字のため、変化することのないクラス名・キャプション名からウインドウハンドルを取得して操作対象を指定するのが一般的なウインドウ操作の流れになります。

VBAのコードを書く際はクラス名・キャプション名があらかじめわかっているアプリケーションを操作する方が、クラス名・キャプション名がまったくわからないアプリケーションを操作するよりもはるかにコードが簡単になります。

スポンサーリンク

クラス名・キャプション名の一覧を取得するVBAコード

今開いているウインドウのクラス名・キャプション名の一覧を取得するVBAコードは以下のようになります。
使用するWindowsAPIは「FindWindow」「IsWindowVisible」「GetWindowText」「GetClassName」「GetNextWindow」の5つです。

それぞれの使い方についてはこちらの記事を参考にしてください。

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

’ウインドウが可視かどうかを取得する
Declare Function IsWindowVisible Lib “user32” _
(ByVal hWnd As Long) 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 GetClassName Lib “user32” Alias “GetClassNameA” _
(ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount 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 i As Long
i = 1

Dim strClassName As String * 100
Dim strCaption As String * 80

Dim hWnd As Long
hWnd = FindWindow(vbNullString, vbNullString) ’引数を両方ともvbNullStringにして1つめのウインドウを取得する

Do
If IsWindowVisible(hWnd) Then
GetWindowText hWnd, strCaption, Len(strCaption)
GetClassName hWnd, strClassName, Len(strClassName)

Cells(i, 1).Value = Left(strClassName, InStr(strClassName, vbNullChar) – 1)
Cells(i, 2).Value = Left(strCaption, InStr(strCaption, vbNullChar) – 1)

i = Application.WorksheetFunction.Max(Cells(60000, 1).End(xlUp).Row, Cells(60000, 2).End(xlUp).Row, Cells(60000, 3).End(xlUp).Row) + 1

End If

hWnd = GetNextWindow(hWnd, GW_HWNDNEXT)

Loop Until hWnd = GetNextWindow(hWnd, GW_HWNDLAST)

End Sub
スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする