その他

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

スポンサーリンク

動作準備

今回は、前回の記事で扱ったエクセル、プログラムを利用することを前提とした「親ウィンドウハンドルの配列からハンドル情報を取得する方法」を紹介します。

まだ前回の記事を読まれていない方は、是非下記リンクから一読して頂けると嬉しいです。

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

プログラム

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


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」とメッセージボックスが出力されます。

おすすめ

確認するためには、ある程度ハンドル情報を把握していないといけません。その情報は以下の記事に沿って作業することで得ることができると思います。

シートに書き出した情報からハンドル情報を知りたい場合は、こちらの下記2つの記事を参照して下さい。

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

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

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]
記事一覧 ハンドル番号、キャプション名、クラス名について書かれた記事のまとめです。 最後までお付き合いいただきありがとうございます! この情報が誰かの役にたてれば幸 ...

雑記

今日10月20日は、日本リサイクルネットワーク会議によって制定された「リサイクルの日」です。「ひとまわり(10)、ふたまわり(20)」の語呂合せが由来だそうで、そこから発展して、今では経済産業省他8省庁が10月を「リデュース・リユース・リサイクル推進月間」とし定めています。

皆さんは普段心掛けているリサイクルなどありますか?

私は地域の資源回収に協力したり、買い物の際は、他の製品と比べて、作る・使う・捨てる時に環境への影響が少ない製品であることを表すエコマークの付いたものを選んだりすることを心掛けています。

将来の地球のためにも、当たり前のようにリデュース・リユース・リサイクルができる人になりたいですね。

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

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

スポンサーリンク

-その他