【问题标题】:How to print WebBrowser control content without showing print dialog?如何在不显示打印对话框的情况下打印 WebBrowser 控件内容?
【发布时间】:2019-07-26 16:25:21
【问题描述】:

当最终用户单击“打印”按钮时,我想将我的 HTML 文档直接打印到特定的网络打印机没有打印机对话窗口。我确实搜索并关注了这个,但这会打开一个对话框窗口以将文档另存为 pdf。

根据评论:

 public static class PrinterClass
    {
        [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool SetDefaultPrinter(string Printer);
    }


    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //List<string> st = new List<string>();

            //foreach (string strPrinter in PrinterSettings.InstalledPrinters)
            //{
            //    if (strPrinter.Contains("My Printer"))
            //    {
            //        PrinterClass.SetDefaultPrinter(strPrinter);
            //    }
            //    st.Add(strPrinter);
            //}

            SetDefaultPrinter("Send To OneNote 2016");
        }

        WebBrowser webBrowser = new WebBrowser();
        void Print(string str)
        {
            webBrowser.DocumentText = str;

            webBrowser.DocumentCompleted += webBrowser_DocumentCompleted;
        }
        void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            IHTMLDocument2 d2;
            d2 = (IHTMLDocument2)((WebBrowser)sender).Document.DomDocument;

            d2.execCommand("Print", false, null);
        }

        private void btn_print_Click(object sender, EventArgs e)
        {
            Print("<html><body>..some html code..</body></html>");
        }

        public static bool SetDefaultPrinter(string defaultPrinter)
        {
            using (ManagementObjectSearcher objectSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_Printer"))
            {
                using (ManagementObjectCollection objectCollection = objectSearcher.Get())
                {
                    foreach (ManagementObject mo in objectCollection)
                    {
                        if (string.Compare(mo["Name"].ToString(), defaultPrinter, true) == 0)
                        {
                             mo.InvokeMethod("SetDefaultPrinter", null, null);
                            return true;
                        }
                    }
                }
            }
            return false;
        }
    }

【问题讨论】:

  • 好吧,添加对mshtml 的引用,那么您就拥有了所有可用的标准 IE11/Edge 接口。 IHtmlDocument2 提供了execCommand("Print") 方法。 IHTMLDocument2 document = ((WebBrowser)sender)Document..DomDocument as IHTMLDocument2; document.execCommand("Print", false, null);。 (写在这里,应该是~正确的),加一个using mshtml;
  • 有两个 COM 引用。一个是Microsoft Internet Controls,另一个是Microsoft Html Object Library。 IIRC,你只需要后者。有一个问题,GAC 经常有一个旧的库在存储中,它非常喜欢并且不想放手。如果是这种情况(例如,您将找不到 IHtmlDocument7IHtmlDocument8),则必须重新构建类型库。
  • 现在,我怀疑问题到底是什么。如果你执行这个:var wb = new WebBrowser(); wb.Navigate(""); wb.Document.Write("&lt;html&gt;&lt;body&gt;..some html code..&lt;/body&gt;&lt;/html&gt;"); wb.Refresh(); wb.Print();,会发生什么?
  • 好吧,在请您试用之前,我已经用我的打印机对其进行了测试。它直接打印到默认打印机(不要求选择一个,如果那是实际问题)。
  • @AnynameDonotcare 显示 pdf 打印机的保存对话框是因为该打印机的行为。因此,如果它不显示打印对话框,则表示它正在工作。您也可以尝试使用 OneNote 等虚拟打印机,它不要求保存文件,只在 OneNote 中打印文件,没有任何提示。

标签: c# windows winforms printing


【解决方案1】:

WebBroswer 控件的最新版本中,Print() 打印到默认打印机而不显示任何对话框:

webBrowser1.Print();

相当于从WebBrowser.ActiveXInstance属性中获取IWebBrowser2的实例,然后通过传递OLECMDID_PRINT作为命令和OLECMDEXECOPT_DONTPROMPTUSER指定不显示提示来调用其ExecWB方法:

int OLECMDID_PRINT = 6;
int OLECMDEXECOPT_DONTPROMPTUSER = 2;
dynamic iwb2 = webBrowser1.ActiveXInstance;
iwb2.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, null, null);

或者在一行代码中:

((dynamic)webBrowser1.ActiveXInstance).ExecWB(6, 2, null, null);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2013-04-05
    相关资源
    最近更新 更多