我正在编写一个应用程序,它可以将(呈现的)HTML 页面打印到安装在运行该应用程序的计算机上的每台打印机上。为此,我创建了一个 WebBrowser,对其调用 print(),然后关闭表单。我为该计算机上安装的每台打印机执行此操作。
我的问题是,当我尝试关闭表单时,页面没有打印出来。关于如何使打印成为独立后台进程的任何想法,以便我可以在仍在打印时关闭表单?
这是我目前在表单中的代码:
public PrintForm()
{
InitializeComponent();
string doc = "C:\\Path\\To\\file.htm";
browser.Url = new Uri(doc);
}
private void PrintForm_Shown(object sender, EventArgs e)
{
Thread t = new Thread(browser.Print);
t.IsBackground = false;
t.Start();
this.Close();
}
我有另一个类将每个已安装的打印机切换为默认打印机(以编程方式绕过打印对话框的唯一方法)然后调用
Applicated.Run(new PrintForm());
真的很简单的代码。只是有点麻烦。
最佳答案
是的,这行不通。您将面临的第一个障碍是 WebBrowser 是一个单元线程 COM 组件。在线程上调用其 Print 方法实际上不起作用,COM 遵循组件的线程要求并将调用编码到创建它的线程,即您的 UI 线程。
您的代码很糟糕,因为窗体的 Close() 调用也处理了它的所有子控件。包括网络浏览器。您可以将它从它的 Control 集合中移除以防止这种情况发生,但是当它完成打印时您仍然必须调用它的 Dispose() 方法。
解决这个问题在技术上并非不可能,您必须创建一个 STA 线程来泵送消息循环。在 this thread 中检查我的代码的方法。
关于c# - 如何在打印时关闭 WebBrowser?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4166643/