Visit Mozilla.org

Code snippets:Finding Window Handles

出典: MDC

Windows プラットフォーム上での開発では、さまざまな API やフレームワークが、ウィンドウハンドル (HWND 型) を要求します。Mozilla は出来る限りクロスプラットフォームになるように努力していますが、必要なハンドルを取得するのは難しいです。

Mozilla のウィンドウハンドルへアクセスするためのいくつかの簡単なコードを紹介します。このコードは外部アプリケーションや拡張で利用されている XPCOM コンポーネントからのためのものです。

[編集] コンテントのウィンドウハンドルを取得する

 HWND hContent = 0;

 // メインのブラウザウィンドウを探す必要があります
 HWND hFF = ::FindWindowEx(0, 0, "MozillaUIWindowClass", 0);
 if (hFF) {
    // 次に固定された構造にしたがって降りて行きます
    HWND hTemp;
    hTemp = ::FindWindowEx(hFF, 0, "MozillaWindowClass", 0);
    hTemp = ::FindWindowEx(hTemp, 0, "MozillaWindowClass", 0);

    // このレベルにあるうち一つのウィンドウだけが子を持つと仮定します
    // そしてその一つの子がわれわれが必要なものです
    HWND hChild = ::GetWindow(hTemp, GW_CHILD);
    while (hTemp && !hChild) {
      hTemp = ::GetWindow(hTemp, GW_HWNDNEXT);
      hChild = ::GetWindow(hTemp, GW_CHILD);
    }

    // 子を持つウィンドウを発見したか?
    // その子はコンテントウィンドウのはず
    if (hTemp) {
      hTemp = ::GetWindow(hTemp, GW_CHILD);
      hContent = ::FindWindowEx(hTemp, 0, "MozillaContentWindowClass", 0);
    }
 }

 // この時点で hContent は NULL もしくは、コンテントウィンドウの HWND です

ウィンドウ構造に関する仮定がどの程度危険かは分かりませんが、SPY++ で得た値とは一致しました。