- ベストアンサー
子ウインドウを特定する方法とは?
- VisualBasic2008Expressでプログラミングをしています。楽天ツールバーの検索窓のハンドルを取得してsendmessageで文字列を送るプログラムを作ろうとしています。
- UISpy.exeで調べてところ"edit"というクラス名で深い階層にあるようで、FindWindowExでは取得できないようです。なので下のURLのコードを基に検索窓のクラス名"edit"からハンドルを取得できるように作り替えようと思っています。
- 列挙された子ウインドウの中からクラス名"edit"を特定してハンドルを取得するには、どのようにコードを作り直せばよいのでしょうか。何も分からない状態でお手数をおかけするでしょうが、どうかよろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じでしょうか ★標準モジュール Module Module1 Delegate Function ウィンドウ列挙( _ ByVal ウィンドウ As Integer, _ ByVal ダミー As Integer) As Integer Declare Function EnumChildWindows Lib "USER32" _ (ByVal ウィンドウ As Integer, _ ByVal コールバック As ウィンドウ列挙, _ ByVal 対象 As Integer) As Integer Declare Function GetClassName Lib "USER32" Alias "GetClassNameA" _ (ByVal ウィンドウ As Integer, _ ByVal 名前 As String, _ ByVal 文字数 As Integer) As Integer Declare Function lstrlen Lib "KERNEL32" Alias "lstrlenA" _ (ByVal 文字列 As String) As Integer Declare Function SysAllocStringByteLen Lib "OLEAUT32" _ (ByVal 文字列 As String, _ ByVal バイト数 As Integer) As String Public 対象ウィンドウ As Integer Function コールバック(ByVal ウィンドウ As Integer, _ ByVal ダミー As Integer) As Integer Dim クラス名 As String クラス名 = Space(128) GetClassName(ウィンドウ, クラス名, Len(クラス名)) クラス名 = SysAllocStringByteLen(クラス名, lstrlen(クラス名)) If クラス名 = "edit" Then 対象ウィンドウ = ウィンドウ Else EnumChildWindows(ウィンドウ, AddressOf コールバック, 0) If 対象ウィンドウ = 0 Then コールバック = 1 End If End Function End Module ★実行例 対象ウィンドウ = 0 EnumChildWindows(Me.Handle, AddressOf コールバック, 0) 原理を説明します。 (1)EnumChildWindowsを実行すると、指定したウィンドウの 子ウィンドをパラメータにしてコールバックを呼び出します。 (2)コールバック内ではパラメータのウィンドウのクラス名を GetClassNameを使って取得します。 (3)名前領域は広く取ってあるので、必要な部分を整形して 文字列化します。ここでlastrlen(文字列のバイト数を得る) とSysAllocStringByteLen(VB文字列作成)を使います。 (4)クラス名が"edit"なら共通変数にウィンドウハンドルを 設定します。コールバック関数の戻り値は何も指定しない ので0(FALSE)になります。EnumChildWindowsはコール バックが0を返すと列挙を中止します。 (5)クラス名"edit"でない場合は更に内側のウィンドウを列挙 するため、EnumChildWindowsを呼び出します。これで孫、 曾孫、玄孫、・・・と列挙できます。 目的のウィンドウが見つからない場合は戻り値を1(TRUE)に します。1を返すと列挙が継続されます。 コールバック関数を使うポイントはデリゲード型を定義します。 デリゲードは関数のポインタのようなもので、内部的には ただの整数なのですが、間違った関数形式を指定しないよう 型チェックを厳しくしてあります。
補足
素早いご回答ありがとうございます。 上記の基にしたコードに追加してみたのですが、GetClassNameのクラス名がString型になったせいかbytClassでエラーになってしまいました。この場合どう書き直せばよいでしょうか。 それとフォームモジュール(Form1.vb) で目的の子ウインドウの情報を表示させるにはどう書き直せばよいのでしょうか。 分からないことだらけで申し訳ないですがどうかよろしくお願いします。