2

javascript:print() に設定された href 属性を持つアンカーを含むページに移動してクリックすると、Gecko.GeckoWebBrowser を含む win フォーム アプリを作成したところ、印刷ダイアログが表示されましたが、それが判明しました。そのダイアログでキャンセル ボタンを押すと、Gecko.GeckoWebBrowser が破棄されます。これは、コントロールが WM_DETROY メッセージを受信したことを意味します。どうすれば防ぐことができますか?gecko fx Gecko.GeckoWebBrowser Windows プロシージャを変更し、その Windows メッセージをキャッチしてバイパスしますが、それは役に立たないようです xulrunner-11.0.en-US.win32 を使用しています

4

1 に答える 1

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;
        }
    }
于 2012-04-13T03:38:27.197 に答える