2

我在本机 C++/Win32/MFC 对话框应用程序中使用 MS Web Browser ActiveX 控件通过 HTML 呈现一些信息。

我想在没有任何用户交互的情况下打印内容到指定的打印机(这不是默认打印机)。我想使用的打印机是 PDF 打印机。

我正在使用来自 Code Project 的一个不错的包装类,它使使用 Web 浏览器控件更容易一些(http://www.codeproject.com/Articles/3919/Using-the-WebBrowser-control-simplified)和其中之一包装器提供的东西是打印。它提供了一种使用 ExecWB(OLECMDID_PRINT,OLECMDEXECOPT_DONTPROMPTUSER,...) 来启动打印内容的打印方法。

这很有效,并且无需任何用户交互即可将控件的内容打印到默认打印机。

然后,挑战是让它使用与默认打印机不同的打印机。我最初的尝试是调用 ::SetDefaultPrinter ( http://msdn.microsoft.com/en-us/library/windows/desktop/dd162971(v=vs.85).aspx )。这似乎不起作用。看起来,尽管调用了 ::SetDefaultPrinter,Web 浏览器 ActiveX 控件仍会打印到系统默认打印机。就好像它忽略了这个调用所做的一切。

我尝试按照 MSDN 链接中的建议广播系统设置更改消息,并直接将其发送到浏览器窗口,没有任何运气。

有什么想法可以让 Web 浏览器 activex 控件打印我指定的打印机而不是使用默认打印机?

4

2 回答 2

1

除了您的所有步骤之外,我所做的是在 IE 注册表中设置打印机,这里:

HKCU\Software\Microsoft\Internet Explorer\PageSetup\printer="the required printer name"

并在打印后恢复一切

于 2013-03-06T04:15:40.323 回答
1

我让它工作了。问题的原因不是浏览器控件打印到错误的打印机,而是打印操作(通过 ExecWB)是异步执行的。因此,我将默认打印机设置为 PDF 打印机,然后启动打印,然后恢复原始默认打印机。这发生得很快,以至于当异步打印操作准备好时,原来的默认打印机再次设置为默认打印机,因此它转到了该打印机。

解决方法是将默认打印机设置为 PDF 打印机,启动打印,然后等待打印完成回调。一旦收到回调,它就会恢复原来的默认打印机。

如果您在 Code Project 上使用 Gary Wheeler 出色的 Web 浏览器控件(请参阅此处),那么很容易获得打印完成回调,您只需覆盖虚拟 OnPrintTemplateTeardown() 方法。

于 2013-03-06T21:08:40.177 回答