WebBrowser控件不会从C#打印

我在WinForms应用程序上有一个WebBrowser控件,它正在加载转换为HTML / CSS的XML。 如果我只想在那里或在常规浏览器中查看它,看起来很漂亮。

当表单加载时,它应该导航到该文件,然后当OnDocumentCompleted事件触发时,它应该在注册表中设置页眉,页脚和默认打印机名称,然后为用户指定的许多副本调用Print()。

我通过调试器运行它,它在OnDocumentCompleted事件中调用webBrowser.Print()正确的次数。 没有什么是null,不应该是,WebBrowser控件上的Visible是真的,就像AllowNavigation一样。 是的,打印机已打开并可通过网络访问。 完全相同的代码在项目的其他地方工作,但不在这里。

还有什么可能导致这种地狱般的控制忽略我的打印命令?

理想情况下,我希望将整个内容隐藏在屏幕外,因为这意味着要使用Windows Scheduler运行,用户永远不应该看到它。 我已经读过控件需要可见,所以在我解决这个第一个问题之前,可以等待。

编辑 :我的OnDocumentCompleted事件处理程序的最后两行将DialogResult设置为OK并关闭表单。 删除对Close()的调用让它打印,所以我猜它在关闭窗体并处理WebBrowser控件之前没有进入打印后台处理程序。

只是在关闭之前设置一个等待的任意时间限制,有没有办法告诉它何时完成打印?

原来是一个计时问题,表单在将文档发送到打印后台处理程序之前关闭。 我最后在表单中添加了一个Timer,将其设置为30秒,然后让它的Tick()事件关闭表单。 它之前关闭表单的位置现在只调用closeTimer.Start()。

试试这个:

mshtml.IHTMLDocument2 doc; doc = oWeb.Document; doc.execCommand("Print", True, Nothing); 

来自编辑:

可以使用SHELL命令检查打印队列中作业的状态

这是我从字符串中打印HTML的最佳方式

 void PrintString(string strHTMLText) { WebBrowser wbPrintString = new WebBrowser() { DocumentText = string.Empty }; wbPrintString.Document.Write(strHTMLText); wbPrintString.Document.Title = "Type The Header You Want Here"; Microsoft.Win32.RegistryKey rgkySetting = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Internet Explorer\\PageSetup", true); rgkySetting.SetValue("footer", "Type THe Footer You Want Here"); rgkySetting.Close(); wbPrintString.Parent = this; wbPrintString.ShowPrintPreviewDialog(); wbPrintString.Dispose(); 

}