【问题标题】: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;
}
}