【问题标题】:GeckoFX - WinForms - javascript:print()GeckoFX - WinForms - javascript:print()
【发布时间】:2012-04-12 15:08:45
【问题描述】:

我刚刚创建了一个获胜表单应用程序 上面有 Gecko.GeckoWebBrowser 当我导航到一个带有 href 属性设置为的锚的页面时 javascript:print() 并单击它,将显示打印对话框,但事实证明,当我点击该对话框上的取消按钮时 Gecko.GeckoWebBrowser 被破坏,我的意思是控件接收到 WM_DETROY 消息 关于这里可能发生什么的任何线索? 我该如何预防? 我修改了 gecko fx Gecko.GeckoWebBrowser windows 程序并捕获并绕过该 windows 消息,但似乎没有帮助 顺便说一句,我正在使用 xulrunner-11.0.en-US.win32 和 geckofx-11.dll 问候

【问题讨论】:

    标签: winforms printing geckofx


    【解决方案1】:

    从 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;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 2013-12-30
      • 2014-10-02
      相关资源
      最近更新 更多