【VBA×WindowsAPI】GetNextWindow関数の使い方

GetNextWindow関数

GetNextWindow関数は、指定したウィンドウを基準として、その前後に並んでいるウィンドウのハンドルを取得するための関数です。ウィンドウハンドルとは、ウィンドウを識別するための特別な識別子です。WindowsAPIでは、このハンドルを指定することで、操作対象となるウィンドウを特定します。

またWindows上に表示されているウィンドウには「奥行き(Zオーダー)」という概念があり、ウィンドウは前面から背面へ順番に並んで管理されています。GetNextWindow関数は、この並び順を基準として、指定したウィンドウの「次」または「前」に存在するウィンドウを取得します。

FindWindow関数が条件(クラス名・キャプション名)を指定して直接ウィンドウを取得するのに対し、GetNextWindow関数は取得済みのウィンドウハンドルを起点として探索を進める関数です。そのため、同じクラス名のウィンドウが複数存在する場合やウィンドウをZオーダー順に順番に処理したい場合に有効です。この他にもGetActiveWindow関数GetParent関数など、ウィンドウハンドルを取得するための関数は複数存在します。

 

使用方法

GetNextWindow関数を使用するには、あらかじめ関数の宣言をしておく必要があります。
※宣言をしないと関数は使用できず、実行時エラーとなるので注意しましょう。

使用しているWindowsが32bitか64bitかによって宣言方法が異なります。
環境に合わせて以下のいずれかをコードの一番初め(Option Explicitの次の行あたり)に記述します。

icon-code 64bit

Declare PtrSafe Function GetNextWindow Lib “user32" Alias “GetWindow" _
(ByVal hwnd As LongPtr, ByVal wFlag As Long) As LongPtr

icon-code 32bit

Declare Function GetNextWindow Lib “user32" Alias “GetWindow" _
(ByVal hwnd As Long, ByVal wFlag As Long) As Long

どちらを書けば良いかわからない場合は、以下の条件コンパイル構文を使用して下さい。

#If VBA7 Then
    Declare PtrSafe Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As LongPtr, ByVal wFlag As Long) As LongPtr
#Else
    Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wFlag As Long) As Long
#End If

各関数の宣言文は「Private / Public」を付けて有効範囲を指定することもできます。

Private Declare PtrSafe Function~:モジュール内のみ有効
Public Declare PtrSafe Function~:モジュール外からも呼び出し可能

 

構文

GetNextWindow関数の構文は下記の通りです。

icon-code GetNextWindow関数

hwndNext = GetNextWindow(hwnd, wFlag)

引数

hwnd (LongPtr / Long)

基準となるウィンドウのハンドルを指定します。
FindWindow関数やGetActiveWindow関数などで取得したウィンドウハンドルを指定します。

wFlag (Long)

取得するウィンドウの方向を指定します。

定数名 説明
GW_HWNDNEXT 2 次に並んでいるウィンドウを取得
GW_HWNDPREV 3 前に並んでいるウィンドウを取得

 
戻り値

hwndNext (LongPtr / Long)

関数が成功した場合、指定したウィンドウの前後に存在するウィンドウのハンドルを返します。
対象となるウィンドウが存在しない場合は、NULL(0)が返ります。

icon-edit 取得ウィンドウの並び順 ― GetNextWindow関数は、画面上の表示順(Zオーダー)に基づいてウィンドウを取得します。
最前面のウィンドウでGW_HWNDPREVを指定した場合や、最背面のウィンドウでGW_HWNDNEXTを指定した場合は、NULL(0)が返ります。

 

サンプルコード

以下はFindWindow関数で取得したExcelウィンドウを起点として、次に並んでいるウィンドウのキャプション名を取得するサンプルコードです。

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As LongPtr, ByVal wFlag As Long) As LongPtr
Private Declare PtrSafe Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As LongPtr, ByVal lpString As String, ByVal cch As Long) As Long

Private Const GW_HWNDNEXT As Long = 2
Private Const GW_HWNDPREV As Long = 3

Sub main()

    Dim hwndBase As LongPtr
    Dim hwndNext As LongPtr
    Dim sBuf As String * 100
    Dim sCap As String

    hwndBase = FindWindow("XLMAIN", vbNullString)
    hwndNext = GetNextWindow(hwndBase, GW_HWNDNEXT)

    If hwndNext <> 0 Then
        GetWindowText hwndNext, sBuf, Len(sBuf)
        sCap = Left(sBuf, InStr(sBuf, vbNullChar) - 1)
        Debug.Print sCap
    End If

End Sub

 

icon-share-square VBA×WindowsAPIまとめページ

icon-share-square 参考

Microsoft公式:GetNextWindow 関数 (winuser.h) – Win32 apps

Excel,VBA,Windows API