2

有没有办法让我将 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 打印时那样将其缩放到纸张上:

    矩形矩形;
    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,页面,NULL,pTargetDevice,printerhdc,printerhdc,&rect,NULL,NULL,0);//打印太小
    EndPage(printerhdc);
    EndDoc(printerhdc);

  2. 向 IE 控件发送 WM_PAINT。我在这个方面做得不多,因为我在网上的一个帖子中读到这并没有那么好用。

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

  4. 使用 IHTMLElement、IHTMLElementRender->SetDocumentPrinter、IHTMLElementRender->DrawToDc。微软已取消对 IE9 的支持

您可能有的任何想法将不胜感激!提前致谢!

4

1 回答 1

1

如果您对使用默认打印机有一定的灵活性,这里有另一个想法。不过,这有点绕。

  • 使您的默认打印机成为一些 PDF 编写器(如 Amyuni PDF 或 Adob​​e Distiller)。这些打印机驱动程序将传入的作业转换为 PDF 文件,您可以将其设置为将文件保存在某个磁盘位置。

  • 使用 PowerShell 将此 PDF 文件打印到您需要的目标打印机。您可以使用 PrintUI DLL 接口或使用“打印”动词。http://www.eggheadcafe.com/software/aspnet/30441939/how-to-suppress-printdialog-when-using-print-verb.aspx提供了一个示例。通过这样做,您可以在此脚本中进行所有打印机队列自定义,并保持默认打印机不变

于 2011-05-02T05:43:35.760 回答