その他

VBA:親ウィンドウハンドルの配列からハンドル情報を取得[No71]

投稿日:2020年10月20日 更新日:

スポンサーリンク

動作準備

次の記事のエクセル、プログラムを利用前提の紹介となります。

no image
VBA:ハンドル情報(hwnd)配列取得・一覧出力[No70]
VBAでウィンドウハンドル(Window Handle、HWND)を操作するには次の情報が(1つ以上)必要です。 ハンドル番号(HAND ID、Handle ID、hwnd ID、H ...

プログラム

ハンドル番号から取得する


Option Explicit

Public Sub ViewHwnd()
    Dim ArrayHWND(3) As Variant

    Dim hwndNo As Long
    hwndNo = 1246624

    Dim ArrayTest As Variant
    ArrayTest = GetWindowHwnd(hwndNo)

    If IsEmpty(ArrayTest) = True Then
        MsgBox "Nothing. ViewHwnd"
        Exit Sub
    Else
        hwndNo = ArrayTest(1)
        If hwndNo = 0 Then
            MsgBox "Error. ViewHwnd"
            Exit Sub
        Else
            MsgBox "HAND種類:" & ArrayTest(0) & vbCrLf & _
                   "ハンドル番号:" & ArrayTest(1) & vbCrLf & _
                   "キャプション名:" & ArrayTest(2) & vbCrLf & _
                   "クラス名:" & ArrayTest(3)
        End If
    End If
End Sub

Private Function GetWindowHwnd(ByVal tempHwndNo As Long) As Variant

    Dim ArrayHWND(3) As Variant

    Erase ArrayHWND

    'シートにハンドル情報を出力したい場合(GetAllParentHwnd処理含)
'    Call ハンドル情報出力
    'ハンドル情報を配列に格納だけしたい場合
     Call GetAllParentHwnd

'   ハンドル情報の入っている配列
'   Array_hwndTypeName | Array_hwndNo | Array_captionName |Array_className
    Dim i As Long
    For i = LBound(Array_hwndTypeName) To UBound(Array_hwndTypeName)
        If Array_hwndNo(i) = tempHwndNo Then
            ArrayHWND(0) = Array_hwndTypeName(i)
            ArrayHWND(1) = Array_hwndNo(i)
            ArrayHWND(2) = Array_captionName(i)
            ArrayHWND(3) = Array_className(i)

            GetWindowHwnd = ArrayHWND
            Exit For
        End If
    Next i
End Function

スポンサーリンク

キャプション名から取得する


Public Sub ViewHwnd()

    Dim ArrayHWND(3) As Variant

    Dim hwndNo As Long

    Dim captionName As String
    captionName = "hogehoge_01.xlsm"

    Dim ArrayTest As Variant
    ArrayTest = GetWindowHwnd(captionName)

    If IsEmpty(ArrayTest) = True Then
        MsgBox "01:Nothing Or Error. ViewHwnd"
        Exit Sub
    Else
        hwndNo = ArrayTest(1)
        If hwndNo = 0 Then
            MsgBox "02:Nothing Or Error. ViewHwnd"
            Exit Sub
        Else
            MsgBox "HAND種類:" & ArrayTest(0) & vbCrLf & _
                   "ハンドル番号:" & ArrayTest(1) & vbCrLf & _
                   "キャプション名:" & ArrayTest(2) & vbCrLf & _
                   "クラス名:" & ArrayTest(3)
        End If
    End If
End Sub

Private Function GetWindowHwnd(ByVal tempCaptionName As String) As Variant

    Dim ArrayHWND(3) As Variant

    Erase ArrayHWND

    'シートにハンドル情報を出力したい場合(GetAllParentHwnd処理含)
'    Call ハンドル情報出力
    'ハンドル情報を配列に格納だけしたい場合
     Call GetAllParentHwnd

'   ハンドル情報の入っている配列
'   Array_hwndTypeName | Array_hwndNo | Array_captionName |Array_className
    Dim i As Long
    For i = LBound(Array_hwndTypeName) To UBound(Array_hwndTypeName)
        'StrComp 関数の場合は完全一致、InStr関数の場合は部分一致
        If InStr(1, Array_captionName(i), tempCaptionName, vbBinaryCompare) <> 0 Then
            ArrayHWND(0) = Array_hwndTypeName(i)
            ArrayHWND(1) = Array_hwndNo(i)
            ArrayHWND(2) = Array_captionName(i)
            ArrayHWND(3) = Array_className(i)

            GetWindowHwnd = ArrayHWND
            Exit For
        End If
    Next i
End Function

スポンサーリンク

クラス名から取得する


Option Explicit

Public Sub ViewHwnd()
    Dim ArrayHWND(3) As Variant

    Dim hwndNo As Long
    
    Dim captionName As String
    captionName = "wndclass_desked_gsk"

    Dim ArrayTest As Variant
    ArrayTest = GetWindowHwnd(captionName)

    If IsEmpty(ArrayTest) = True Then
        MsgBox "Nothing. ViewHwnd"
        Exit Sub
    Else
        hwndNo = ArrayTest(1)
        If hwndNo = 0 Then
            MsgBox "Error. ViewHwnd"
            Exit Sub
        Else
            MsgBox "HAND種類:" & ArrayTest(0) & vbCrLf & _
                   "ハンドル番号:" & ArrayTest(1) & vbCrLf & _
                   "キャプション名:" & ArrayTest(2) & vbCrLf & _
                   "クラス名:" & ArrayTest(3)
        End If
    End If
End Sub

Private Function GetWindowHwnd(ByVal tempClassName As String) As Variant

    Dim ArrayHWND(3) As Variant

    Erase ArrayHWND

    'シートにハンドル情報を出力したい場合(GetAllParentHwnd処理含)
'    Call ハンドル情報出力
    'ハンドル情報を配列に格納だけしたい場合
     Call GetAllParentHwnd

'   ハンドル情報の入っている配列
'   Array_hwndTypeName | Array_hwndNo | Array_captionName |Array_className
    Dim i As Long
    For i = LBound(Array_hwndTypeName) To UBound(Array_hwndTypeName)
'''        'StrComp 関数の場合は完全一致、InStr関数の場合は部分一致
        If InStr(1, Array_className(i), tempClassName, vbBinaryCompare) <> 0 Then
            ArrayHWND(0) = Array_hwndTypeName(i)
            ArrayHWND(1) = Array_hwndNo(i)
            ArrayHWND(2) = Array_captionName(i)
            ArrayHWND(3) = Array_className(i)

            GetWindowHwnd = ArrayHWND
            Exit For
        End If
    Next i
End Function

実行イメージ

Sub「ViewHwnd」を実行し、上手くハンドルを取得できるとMsgBoxでその情報を表示します。

もし取得できなければ「Nothing Or Error. ViewHwnd」とメッセージボックス出力します。

おすすめ

確認するためにはある程度ハンドル情報をつかんでないといけない。その情報は以下記事で得られると思います。

シート書き出しした情報からハンドル情報を知りたい場合はこちらの記事。

no image
VBA:ハンドル情報(hwnd)配列取得・一覧出力[No70]
VBAでウィンドウハンドル(Window Handle、HWND)を操作するには次の情報が(1つ以上)必要です。 ハンドル番号(HAND ID、Handle ID、hwnd ID、H ...

その他、ツールを用いてウィンドウハンドル情報を取得しておきたい場合はこちらの記事。

no image
VBAでハンドル情報(Handle等)を用いて他のアプリケーション(ソフトウェア)を操作する。[No20]
VBAでIE(Internet Explorer)の操作ができるようになって、次は他のアプリケーションを操作する方法。自分用のメモとして残しておきます。定期的な確認作業をオートメーシ ...
no image
Windowsアプリケーション(ソフトウェア)のハンドル情報まとめ[No21]
Windowsのアプリケーションはハンドル(Hadle)で構成されています。今回はアプリケーションのハンドル情報を記載していきたいと思います。 徐々に追記していきます。 Window ...

備考

  • 何故「LBound(Array_hwndTypeName)」「UBound(Array_hwndTypeName)」となっているかですが、各配列には同じ要素数になっているためです。
  • 各配列の同じ配列番号に格納されているものは、同じhwnd情報。例えば、「Array_hwndTypeName(25)」「Array_hwndNo(25)」「Array_captionName(25)」「Array_className(25)」は同じハンドルの情報。
  • この作りでは最初にヒットしたデータを返しています。

関連記事

no image
ウィンドウハンドル関連の記事一覧[No74]
記事一覧 ハンドル番号、キャプション名、クラス名について書かれた記事のまとめです。 最後までお付き合いいただきありがとうございます! この情報が誰かの役にたてれば幸 ...

最後までお付き合いいただきありがとうございます!

この情報が誰かの役にたてれば幸いです。

スポンサーリンク

タグ

-その他

© 2021 BookALittle