2009-05-18 117 views
4

我已经在加载转换为HTML/CSS的XML的WinForms应用程序上拥有WebBrowser控件。看起来很美,如果我只想在那里或在一个普通的浏览器中查看它。WebBrowser控件将不会从C#打印

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

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

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

理想情况下,我希望整个事情都隐藏在屏幕外,因为这意味着使用Windows Scheduler运行,并且用户永远不应该看到它。我已经读过,控制需要可见,但是,直到我解决这个第一个问题时,可以等待。

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

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

回答

4

作业的状态计时问题,在将文档发送给打印后台处理程序之前关闭表单。我最后在表单中添加了一个Timer,将其设置为30秒,并使Tick()事件关闭窗体。之前关闭窗体的位置,它现在只调用closeTimer.Start()。

+1

这取决于作业到达假脱机程序的时间,假定您不需要处理大型作业并且打印系统可用性很高。如果你必须这样做,你可以把一个线程睡30,然后关闭窗体。根据打印作业状态进行更高级别的控制,以保证打印作业。 – Yuan 2011-05-03 21:24:38

3

试试这个:

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

FROM编辑:

它可以使用shell命令来检查原来是一个打印队列

+0

无法转换webBrowser.Document(HTMLDocument的)任何IHTMLDocument *接口的打印HTML的最佳方式。 HTMLDocument确实有它自己的ExecCommand,我使用你的建议来调用它。无论我将showUI设置为true还是false,都不会有任何反应。 – 2009-05-18 17:51:38

+0

您可能不得不明确告诉它使用“(IHTMLDocument2)oWeb.Document;”将Document对象转换为IHTMLDocument2对象另外,请确保您的项目中有MSHTML dll作为参考。 无论如何,这是我如何打印浏览器控件的内容。 – 2009-05-18 18:29:50

-1

这是我发现那位从字符串

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(); 

}