ウィンドウのすべての子ウィンドウを抽出するにはどうすればよいですか?
サンプルコード:
Dim hWnd As IntPtr = ProcessName.MainWindowHandle
For Each hWndChild As IntPtr In hWnd
MsgBox(hWndChild.classname.tostring & ", Caption: " & hWndChild.caption.tostring())
Next
(スパイ++のように)
他の人が示唆したように、EnumWindows
andEnumChildWindows
関数を使用する必要があります。
これは、私がVB6で書いた別のプログラムのコードの一部から移植したばかりの小さなデモプログラムへのリンクです(非常に昔): Windowsスキャナー
それが役に立てば幸い...
編集:これらの機能がどのように機能するかを実際に説明しなければ、これはあまり答えではないことに気づきました。それで、ここに行きます:
このEnumWindows
関数は、最初のパラメーターとしてコールバック関数へのポインターを取ります。2 番目のパラメーターは、コールバック関数に渡すことができる値です。これは、ユーザー定義の引数と考えることができます。
が新しいウィンドウを「見つける」たびEnumWindows
に、コールバック関数を呼び出して新しいウィンドウについて通知します。このコールバック関数は、パラメーターとして、ウィンドウのハンドラーと、ユーザーEnumWindows
が最初に呼び出されたときに指定したオプションのパラメーターを受け取ります。
したがって、基本的には、次のように呼び出しますEnumWindows
。
EnumWindows(New EnumWindowsProc(AddressOf EnumProc), 0)
コールバックとなる関数EnumWindowsProc
への参照を作成するために使用されるデリゲートはどこにありますか。EnumProc
このようなコールバックのシグネチャは次のとおりです。
Private Function EnumProc(hWnd As IntPtr, lParam As IntPtr) As Boolean
検出されたウィンドウの内部配列を設定するのは、この関数内です。
関数の場合はほとんど同じですがEnumChildWindows
、唯一の違いは、最初のパラメーターが親ウィンドウのハンドラーでなければならないことです。他のすべてはまったく同じ方法で処理されます。
プログラムのソース コードを確認すると、 と の両方にWindowsScanner
同じデリゲートと同じコールバック関数を使用していることがわかります。では、最上位ウィンドウまたは子ウィンドウを列挙しているかどうかはどうすればわかりますか? 簡単です。最後のパラメータを「1」に設定するだけです。次に、このパラメーターはコールバック関数 ( ) に渡され、そのパラメーターの値に基づいてさまざまなアクションを実行できます。EnumWindows
EnumChildWindows
EnumChildWindows
EnumProc