mozilla
Your Search Results

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

    ドキュメントのタグと貢献者

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