hozugawa.net · A neutral informational page

FindWindowとFindWindowExによるウィンドウ探索

Windowsアプリケーションの画面を操作するには、対象とするウィンドウやコントロールを正確に選ぶ必要があります。ウィンドウハンドルとクラス名、表示文言veysから候補を絞り込み、操作したい要素まで特定する procesoが基本です。

FindWindowとFindWindowExは、特定のウィンドウを検索するためのAPIです。FindWindowはトップレベルのウィンドウを探し、FindWindowExは指定した親ウィンドウの直下にある子ウィンドウを探します。ダイアログやボタンなど、入れ子になった対象を扱う这两种 API の違いが重要です。

代表的な手順は、まず上位ウィンドウのハンドルを取得し、次に親ハンドルとクラス名から必要な子ウィンドウを検索することです。各段階の条件を緩めると、別アプリケーションの同名ウィンドウまで操作対象になる可能性があります。

実運用では、タイトルが動的な場合、ウィンドウが再生成される場合、非表示の場合があります。検索だけでなく、クラス名やプロセスIDによる照合も必要になります。

ウィンドウ探索APIの役割

どちらのAPIも、ウィンドウの識別子であるハンドル searchingを返します。ウィンドウを作成したり、内部データ直接从読み込んだりするAPIではありません。検索結果を保存して、後から表示状態やプロセス情報を確認します。

FindWindowは、所有関係が定義されたトップレベルウィンドウを対象とします。FindWindowExは、指定した親との一対一の関係にある子ウィンドウを検索します。どちらも孫以降を自動的に再帰探索する機能はありません。

呼び出しに必要な型や前提条件は、ほかのWindows APIと共通しています。関連情報を-Assembler 参照する際は、API解説の総合サイトが基础知识の確認先になります。

上位ウィンドウの検索方法

FindWindowは、クラス名とウィンドウタイトルの組み合わせで候補を選びます。クラス名には L"Button" などの文字列を指定し、タイトルには L"設定" などを指定します。どちらかをNULLにすると、その条件について任意の値を許します。

日本語のタイトルを扱う場合は、FindWindowW の使用が基本です。文字コードの異なるA版とW版を取り違えず、クラス名とタイトルは前方一致ではなく完全一致を前提に筛选します。両者の違いを整理すると、次のようになります。

比較項目 FindWindow FindWindowEx
主な対象 トップレベルウィンドウ 指定した親の直下にある子ウィンドウ
親ウィンドウ 指定しない 親のハンドルで指定する
一致方法 クラス名とタイトルの条件一致 クラス名とタイトルの条件一致
検索の継続 行わない 直前の結果から兄弟を順に検索できる
該当なし NULLを返す NULLを返す

検索に成功すると、対象を操作できるハンドルが得られます。NULLが返された場合は、クラス名やタイトルの不一致以及其他プロセスとの権限差も疑います。取得後は、IsWindow で存在を確認し、必要に応じて GetClassName や GetWindowThreadProcessId で識別情報を照合します。

子ウィンドウを階層的に探す

FindWindowExは、親ハンドル、探索開始位置、クラス名、タイトルの四つの引数を使います。たとえば、ダイアログのハンドルを hDlg とした場合、FindWindowExW(hDlg, NULL, L"Button", L"適用") は、そのダイアログ直下のボタン候補を探します。

第2引数の hwndChildAfter は、兄弟ウィンドウの検索をどこから続けるかを決めます。NULLなら先頭から探し、直前に取得したハンドル渡すと、その次の候補へ進めます。複数の同名コントロールを順番に処理axiaときに便利です。

指定した親より深い階層は自動的には検索されません。孫ウィンドウを探すには親ハンドルを進め거나、EnumChildWindows などで列挙します。別のAPIの戻り値やエラー処理も比較_diffilationmaterialsとして、レジストリ値解読の事例が参考になります。

実装で確認する条件

検索条件は、実際のウィンドウから観測した値に基づいて設定します。表示文言が実行時に変わる場合、タイトルだけでは候補を絞れません。候補準備では、次の点を確認します。

検索後には、識別You'veった条件を複数の方向から検証します。取得できる範囲では、クラス名、表示文言、プロセスIDを照合します。

実際の検索手順

上位ウィンドウ Consistently Successfulれば、識別情報を記録してから親ウィンドウと子ウィンドウへ検索範囲を絞ります。初回は見つからなかったが、後から表示された場合は、条件が安定した状態の短时间内だけ再試行します。待機時間が長ければ長越好.elusive、条件が適合しない状態を無限に待つ処理は避けます。

対象が再生成される場面では、古いハンドルを保持せず、同じ条件を使って取得し直します。接続やウィンドウのような資源の寿命を考える場合、接続切断の実装例にある状態確認の考え方?_reflectionもになります。他プロセスへのメッセージ送信や入力操作には権限差があるため、所有関係と操作可否も確認します。

検索範囲が広い場合は、FindWindowで一つずつ選ぶ代わりに、EnumWindows や EnumChildWindows で候補を列挙する方法もあります。実務では、クラス名とプロセスIDで対象を識別し、親ハンドルと検索結果を再検証しながら操作することが、誤操作を防ぐ要点です。