Finding Window Handles

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

Gecko 2.0 note
(Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1)

Gecko 2.0 (Firefox 4 / Thunderbird 3.3 / SeaMonkey 2.1) から、最上位のブラウザウィンドウだけが HWND をもつようになりました。(タブの中の)Web コンテンツウィンドウは、それ自身の HWND を持つことはありません。一般に最上位のブラウザウィンドウの HWND は子供を持ちませんが、(Flash のような) ウィンドウモードのプラグインは、最上位のブラウザウィンドウの HWND を親とする HWND を持ちます。

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++ で得た値とは一致しました。

Document Tags and Contributors

Contributors to this page: Taken, Shimono, Mgjbot
最終更新者: Taken,