5

ウィンドウのすべての子ウィンドウを抽出するにはどうすればよいですか?

サンプルコード:

Dim hWnd As IntPtr = ProcessName.MainWindowHandle
For Each hWndChild As IntPtr In hWnd
  MsgBox(hWndChild.classname.tostring & ", Caption: " & hWndChild.caption.tostring())
Next

(スパイ++のように)

4

1 に答える 1

4

他の人が示唆したように、EnumWindowsandEnumChildWindows関数を使用する必要があります。

これは、私が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」に設定するだけです。次に、このパラメーターはコールバック関数 ( ) に渡され、そのパラメーターの値に基づいてさまざまなアクションを実行できます。EnumWindowsEnumChildWindowsEnumChildWindowsEnumProc

于 2013-01-18T22:53:43.233 に答える