2012-04-12 10 views
2

私は JavaScriptに設定href属性があるアンカーでページに移動するとき、私はちょうどそれ にGecko.GeckoWebBrowserとWinフォームアプリケーション を作成します。print()それをクリックすると、印刷ダイアログが表示されますが、そのダイアログのキャンセルボタンを押すと、Gecko.GeckoWebBrowserが破棄されます。つまり、コントロールがWM_DETROYメッセージを受け取ります。 ここで何が起きる可能性があるのか? どうすればそれを防ぐことができますか? 私はヤモリFX Gecko.GeckoWebBrowserウィンドウ手順とキャッチとバイパス窓のメッセージを変更しますが、ところで、私はXULRunnerの-11.0.en-US.win32とgeckofx-11.dllを使用して よろしくGeckoFX - リサイズ - のjavascript:プリント()

答えて

0
い を助けていないようです

firefoxコードを見ると、firefoxがWM_DESTROYメッセージを送信しているようです。

nsPrintingPromptService::ShowPrintDialog(nsIDOMWindow *parent, nsIWebBrowserPrint *webBrowserPrint, nsIPrintSettings *printSettings) 
{ 
    NS_ENSURE_ARG(parent); 

    HWND hWnd = GetHWNDForDOMWindow(parent); 
    NS_ASSERTION(hWnd, "Couldn't get native window for PRint Dialog!"); 

    return NativeShowPrintDialog(hWnd, webBrowserPrint, printSettings); 
} 



nsresult NativeShowPrintDialog(HWND    aHWnd, 
           nsIWebBrowserPrint* aWebBrowserPrint, 
           nsIPrintSettings* aPrintSettings) 
{ 
    PrepareForPrintDialog(aWebBrowserPrint, aPrintSettings); 

    nsresult rv = ShowNativePrintDialog(aHWnd, aPrintSettings); 
    if (aHWnd) { 
    ::DestroyWindow(aHWnd); 
    } 

    return rv; 
} 

なぜこれがこれを行うのかわかりません。この問題を解決するために

いくつかのオプション: "print.always_print_silent"

    • ターン提供し、独自のnsIPrintingPromptService
    • を登録提供し、独自のnsIWindowWatcherサービスを登録します。

    nsIWindowWatcherの方法はGetHWNDForDOMWindowを見てこれを行うための適切な方法のようになります。

    HWND 
    nsPrintingPromptService::GetHWNDForDOMWindow(nsIDOMWindow *aWindow) 
    { 
        nsCOMPtr<nsIWebBrowserChrome> chrome; 
        HWND hWnd = NULL; 
    
        // We might be embedded so check this path first 
        if (mWatcher) { 
         nsCOMPtr<nsIDOMWindow> fosterParent; 
         if (!aWindow) 
         { // it will be a dependent window. try to find a foster parent. 
          mWatcher->GetActiveWindow(getter_AddRefs(fosterParent)); 
          aWindow = fosterParent; 
         } 
         mWatcher->GetChromeForWindow(aWindow, getter_AddRefs(chrome)); 
        } 
    
        if (chrome) { 
         nsCOMPtr<nsIEmbeddingSiteWindow> site(do_QueryInterface(chrome)); 
         if (site) 
         { 
          HWND w; 
          site->GetSiteWindow(reinterpret_cast<void **>(&w)); 
          return w; 
         } 
        }