2012-11-12 24 views
5

どのようにしてウィンドウのすべての子ウィンドウを抽出できますか?ウィンドウのすべての子ウィンドウを抽出する

サンプルコード:(++スパイのような)

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

+5

EnumChildWindows()を使用します。 –

+0

ありがとう:)私はそれを試してみます。 – famf

+0

Windowsまたはコントロール? –

答えて

1

他の人が示唆しているのと同じように、あなたはEnumWindowsEnumChildWindows機能を使用する必要があります。

ここで私はちょうど私がVB6で書かれていた別のプログラム(非常に長い時間前)からのコードの断片から移植された小さなデモプログラムへのリンクです: Windows Scanner

はそれが役に立てば幸い...


編集:私は、実際にこれらの機能がどのように機能するか説明していない限り、これはほとんど答えではないことに気付きました。したがって、ここに行く:

EnumWindows関数は、最初のパラメータとしてコールバック関数へのポインタをとります。 2番目のパラメータは、コールバック関数に渡すことができる値です。ユーザー定義の引数と考えることができます。

毎回EnumWindowsが新しいウィンドウを見つけたら、コールバック関数を呼び出して新しいウィンドウについて通知します。このコールバック関数は、ウィンドウのハンドラと、EnumWindowsが最初に呼び出されたときにユーザが指定したオプションのパラメータをパラメータとしてとります。

ので、基本的に、これはあなたがEnumWindowsを呼び出す方法です:

EnumWindowsProcは、私たちのコールバックとなります EnumProc機能への参照を作成するために使用されるデリゲートです
EnumWindows(New EnumWindowsProc(AddressOf EnumProc), 0) 

。次のように

、このようなコールバックのシグネチャは次のとおりです。

Private Function EnumProc(hWnd As IntPtr, lParam As IntPtr) As Boolean 

それはあなたが発見されたWindowsの内部配列を移入この関数内です。

EnumChildWindowsの機能はほとんど同じですが、最初のパラメータは親ウィンドウのハンドラでなければなりません。 他のすべてはまったく同じ方法で処理されます。

WindowsScannerプログラムのソースコードを確認すると、EnumWindowsEnumChildWindowsの両方に同じデリゲートと同じコールバック関数が使用されていることがわかります。 トップレベルまたはチャイルドウィンドウを列挙しているかどうかはどのようにわかりますか? 簡単に、私は単にEnumChildWindowsの最後のパラメータを "1"に設定します。次に、このパラメータはコールバック関数(EnumProc)に渡され、そのパラメータの値に基づいて異なるアクションを実行できます。

関連する問題