我有没有办法将PrintDlg结构(或类似的东西)传递给我的WebBrowser(Internet Explorer / IWebBrowser2)控件,以便它可以打印到PrintDlg中指定的打印机而不会弹出打印对话框?我想这样做而不更改默认打印机。 IWebBrowser2 :: ExecWB提供了一种跳过对话框弹出窗口(OLECMDEXECOPT_DONTPROMPTUSER)的方法,但不是指定打印机的方法。
只更改默认打印机有两个问题:1)速度慢,2)Internet Explorer保持当前的打印机缓存。当您打印到默认打印机时,它将缓存该打印机。如果您随后更改默认打印机并告诉它再次打印,IE将不会使用新的默认打印机,它将使用其缓存的当前打印机。
在IE 5.5之后,当前的打印机未存储在Windows注册表中。
作为替代方案,我研究了4种不同的想法,用于从IE控件获取图像并自行打印,而不是让控件自行打印:
使用IViewObject :: Draw。我可以获得图像,但无法按照与IE打印时相同的方式进行缩放:
RECTL rect;
rect.left = 0;
rect.top = 0;
rect.right = GetDeviceCaps(printerhdc,PHYSICALWIDTH);
rect.bottom = GetDeviceCaps(printerhdc,PHYSICALHEIGHT);
StartDoc(printerhdc,& di);
起始页(printerhdc);
HRESULT hr = pViewObj-> Draw(DVASPECT_DOCPRINT,page,NULL,pTargetDevice,printerhdc,printerhdc,& rect,NULL,NULL,0); //打印太小了
尾页(printerhdc);
EndDoc(printerhdc);
将WM_PAINT发送到IE控件。我没有对这个做过多少工作,因为我在网上看到这个问题并没有那么好。
AxDHTMLEDLib。文档很少,我认为这仅适用于.net
使用IHTMLElement,IHTMLElementRender-> SetDocumentPrinter,IHTMLElementRender-> DrawToDc。微软已撤回对IE9的支持
您可能会有任何想法,我将非常感激!提前谢谢!
答案 0 :(得分:1)
如果你有使用默认打印机的灵活性,这是另一个想法。虽然这有点圆了。
使您的默认打印机成为PDF编写器(如Amyuni PDF或Adobe Distiller)。这些打印机驱动程序将传入的作业转换为PDF文件,您可以将其设置为将文件保存在某个磁盘位置。
使用PowerShell将此PDF文件打印到您需要的目标打印机。您可以使用PrintUI DLL接口或使用“打印”动词。 http://www.eggheadcafe.com/software/aspnet/30441939/how-to-suppress-printdialog-when-using-print-verb.aspx提供了一个示例。通过执行此操作,您可以在此脚本中执行所有打印机队列自定义,并按原样保留默认打印机