【问题标题】:Close Application after WebBrowser printWebBrowser 打印后关闭应用程序
【发布时间】:2019-08-01 13:46:52
【问题描述】:

我尝试使用 WebBrowser 类打印格式化的 HTML。打印后,我想关闭应用程序。如果我尝试使用关闭应用程序,打印将无法正常工作。我尝试使用计时器也没有任何效果。

请在下面找到代码。

static void Main(string[] args) {
 var b = new Program();
 string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);
 b.runBrowserThread("file://" + appPath + "/receipt.html");

}

private void runBrowserThread(string url) {
 var th = new Thread(() => {
  var br = new WebBrowser();
  br.DocumentCompleted += browser_DocumentCompleted;
  br.Navigate(url);
  Application.Run();
 });
 th.SetApartmentState(ApartmentState.STA);
 th.Start();
}

void browser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
 var br = sender as WebBrowser;
 br.Print();
 //Application.ExitThread();
 Environment.Exit(0);
}

【问题讨论】:

标签: c# .net winforms printing webbrowser-control


【解决方案1】:

PrintTemplateTeardown 是您正在寻找的。 您可以添加对SHDocVw 的引用。然后您可以访问IWebBrowser2DWebBrowserEvents2_Event 等接口。

您可以在参考管理器窗口的 COM 选项卡中找到 SHDocVw 作为“Microsoft Internet Controls”。

您可以订阅DocumentCompleted 事件以了解文件/url 加载何时完成。您可以通过调用IWebBrowser2.ExecWB 打印 html 文档而不显示打印对话框。您也可以订阅DWebBrowserEvents2_Event.PrintTemplateTeardown 以了解打印完成的时间,以便您关闭应用程序:

using System;
using System.Windows.Forms;
using SHDocVw;
class Program
{
    static System.Windows.Forms.WebBrowser browser;
    [STAThread]
    static void Main()
    {
        var fileName = "http://google.com";
        browser = new System.Windows.Forms.WebBrowser();
        browser.ScriptErrorsSuppressed = true;
        browser.DocumentCompleted += browser_DocumentCompleted;
        browser.Navigate(fileName);
        Application.Run();
    }
    private static void browser_DocumentCompleted(object sender, 
        WebBrowserDocumentCompletedEventArgs e)
    {
        var iwb2 = (IWebBrowser2)browser.ActiveXInstance;
        var events = (DWebBrowserEvents2_Event)browser.ActiveXInstance;
        events.PrintTemplateTeardown += browser_PrintTemplateTeardown;
        var missing = Type.Missing;
        iwb2.ExecWB(OLECMDID.OLECMDID_PRINT, OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, 
        ref missing, ref missing);
    }
    private static void browser_PrintTemplateTeardown(object pDisp)
    {
        browser.Dispose();
        Application.Exit();
    }
}

【讨论】:

  • 这行得通!。我试图打印收据,但它留下了额外的空间和页码 url 一切。无论如何我们可以删除它吗?
  • 我可以建议两个选项。如果您想继续使用 html 打印,请尝试创建简单的 html 输出或使用打印机友好样式(使用媒体查询)。如果您可以选择使用 RDLC,您可以使用设计 RDLC 报告并打印,看看this post.
  • 我是用 html 设计的,只是设计看起来不错。我也写了几个打印查询,但它仍然是打印页码并在底部留下额外的空白
  • 为了更清楚,我们需要 HTML 内容(和样式)为minimal reproducible example。另外,由于它与当前帖子没有任何关系,我认为最好发布一个新问题。如果您提出新问题,请随时通知我,我会看看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多