如何使用WebBrowser控件以编程方式更改打印机设置?

19

我最终找到了一种方法,如何在不提示用户或显示IE窗口的情况下打印转换后的XML,但现在我需要指定打印份数和可能的其他打印机设置。

有没有一种方法可以通过编程方式更改WebBrowser控件上的打印机设置?

相关代码:

private static void PrintReport(string reportFilename)
{
    WebBrowser browser = new WebBrowser();

    browser.DocumentCompleted += browser_DocumentCompleted;

    browser.Navigate(reportFilename);
}

private static void browser_DocumentCompleted
    (object sender, WebBrowserDocumentCompletedEventArgs e)
{
    WebBrowser browser = sender as WebBrowser;

    if (null == browser)
    {
        return;
    }

    browser.Print();

    browser.Dispose();
}
4个回答

17

我成功的唯一方法是实时修改注册表(并将其更改回来以不影响其他内容)。

您可以在CurrentUser下的“Software\Microsoft\Internet Explorer\PageSetup”中找到所需的设置。

要更改打印机,您可以使用以下代码:

using System.Management

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;
}

关于复印数量,您可以将WebBrowser.Print放在while循环中。


如果用户被锁定为非管理员,那么这种方法会有什么问题吗?我需要设置哪些注册表键? - Chris Doggett
只要用户能够更改页面设置对话框中的设置,您就可以即时编辑注册表设置。我会查找这些键并将它们放在我的答案中。 - Austin Salonen
有没有办法通过这种方法更改打印机名称或副本数量?那是我真正需要做的事情,但注册表键只有页眉、页脚和边距。如果没有,我会接受你的答案,并强制用户选择他们该死的打印机和副本数量。 - Chris Doggett
3
谢谢。删除了InvokeMethod调用中的一个null后,这正是我所需要的。工作得非常完美。 - Chris Doggett

5
            string strKey = "Software\\Microsoft\\Internet Explorer\\PageSetup";
        bool bolWritable = true;

        RegistryKey oKey = Registry.CurrentUser.OpenSubKey(strKey, bolWritable);
        Console.Write(strKey);

        if (stringToPrint.Contains("Nalog%20za%20sluzbeno%20putovanje_files"))
        {
            oKey.SetValue("margin_bottom", 15);
            oKey.SetValue("margin_top", 0.19);
        }
        else
        {
            //Return onld walue
            oKey.SetValue("margin_bottom", 0.75);
            oKey.SetValue("margin_top", 0.75);
        }

你能演示如何根据原帖作者的要求更改打印份数吗? - Simon MᶜKenzie

2
你需要通过代码更改注册表设置,以更改Internet Explorer或Web浏览器控件的设置。请查看下面的链接,它描述了如何进行操作。如果你需要通过注册表修改其他选项,则可以使用regedit.exe查找Internet Explorer拥有哪些其他键。

http://support.microsoft.com/kb/236777

提示:您应该注意,通过代码对Internet Explorer的注册表设置所做的任何更改将在您的系统/用户帐户上持续存在。

那个 MSDN 页面太糟糕了。它并没有显示那些注册表键的实际值。而且,它所述的显然不完全正确。有一种方法可以在不对全局范围进行更改的情况下完成(部分内容):https://support.microsoft.com/zh-cn/kb/267240 - c00000fd

0

这对我很有效,但是我使用的是 .NET 3.5

this.webBrowser1.ShowPrintDialog();

4
那也可以,但是针对三年前我所需的功能,必须完全通过编程实现,不能有用户交互。有趣的是,当我花了数月时间编写报告打印代码后,高层决定不允许打印,只能查看。 - Chris Doggett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接