使用IE控件打印到特定打印机而不更改默认打印机

时间:2011-04-30 16:05:08

标签: c++ internet-explorer printing webbrowser-control iwebbrowser2

我有没有办法将PrintDlg结构(或类似的东西)传递给我的WebBrowser(Internet Explorer / IWebBrowser2)控件,以便它可以打印到PrintDlg中指定的打印机而不会​​弹出打印对话框?我想这样做而不更改默认打印机。 IWebBrowser2 :: ExecWB提供了一种跳过对话框弹出窗口(OLECMDEXECOPT_DONTPROMPTUSER)的方法,但不是指定打印机的方法。

只更改默认打印机有两个问题:1)速度慢,2)Internet Explorer保持当前的打印机缓存。当您打印到默认打印机时,它将缓存该打印机。如果您随后更改默认打印机并告诉它再次打印,IE将不会使用新的默认打印机,它将使用其缓存的当前打印机。

在IE 5.5之后,当前的打印机未存储在Windows注册表中。

作为替代方案,我研究了4种不同的想法,用于从IE控件获取图像并自行打印,而不是让控件自行打印:

  1. 使用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);

  2. 将WM_PAINT发送到IE控件。我没有对这个做过多少工作,因为我在网上看到这个问题并没有那么好。

  3. AxDHTMLEDLib。文档很少,我认为这仅适用于.net

  4. 使用IHTMLElement,IHTMLElementRender-> SetDocumentPrinter,IHTMLElementRender-> DrawToDc。微软已撤回对IE9的支持

  5. 您可能会有任何想法,我将非常感激!提前谢谢!

1 个答案:

答案 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提供了一个示例。通过执行此操作,您可以在此脚本中执行所有打印机队列自定义,并按原样保留默认打印机