c# - 如何在打印时关闭 WebBrowser?

标签 c# winforms

我正在编写一个应用程序,它可以将(呈现的)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/

相关文章:

c# - 我应该在使用 Linq-to-SQL 浮点的数据库和对象中使用什么类型?

c# - WindowsFormsApplicationBase SplashScreen 使登录表单忽略按键,直到我单击它 - 如何调试?

c# - 从另一个表格关闭一个表格?

c# - 创建可以通过在背景区域中的任意位置拖动来移动的非矩形表单

c# - 检查用户输入是否在组合框项目中

c# - 处理 MVVM 中的周期性线程

c# - .NET和sql server数据库链接

c# - 跨线程的 TraceSource 不起作用?

c# - 值不能为空。参数名称 : dataSource. 编辑数据网格并保存到数据库

c# - C# Windows 应用程序中的两个 UI 线程