• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:子ウインドウを特定する)

子ウインドウを特定する方法とは?

このQ&Aのポイント
  • VisualBasic2008Expressでプログラミングをしています。楽天ツールバーの検索窓のハンドルを取得してsendmessageで文字列を送るプログラムを作ろうとしています。
  • UISpy.exeで調べてところ"edit"というクラス名で深い階層にあるようで、FindWindowExでは取得できないようです。なので下のURLのコードを基に検索窓のクラス名"edit"からハンドルを取得できるように作り替えようと思っています。
  • 列挙された子ウインドウの中からクラス名"edit"を特定してハンドルを取得するには、どのようにコードを作り直せばよいのでしょうか。何も分からない状態でお手数をおかけするでしょうが、どうかよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.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を返すと列挙が継続されます。 コールバック関数を使うポイントはデリゲード型を定義します。 デリゲードは関数のポインタのようなもので、内部的には ただの整数なのですが、間違った関数形式を指定しないよう 型チェックを厳しくしてあります。

noname#255144
質問者

補足

素早いご回答ありがとうございます。 上記の基にしたコードに追加してみたのですが、GetClassNameのクラス名がString型になったせいかbytClassでエラーになってしまいました。この場合どう書き直せばよいでしょうか。 それとフォームモジュール(Form1.vb) で目的の子ウインドウの情報を表示させるにはどう書き直せばよいのでしょうか。 分からないことだらけで申し訳ないですがどうかよろしくお願いします。

関連するQ&A