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

C# 如何使用WebBrowser控件以编程方式更改打印机设置?,c#,winforms,printing,webbrowser-control,C#,Winforms,Printing,Webbrowser Control,我最终在没有提示用户或显示IE窗口的情况下找到了答案,但现在我需要指定份数以及其他打印机设置 有没有办法以编程方式更改WebBrowser控件上的打印机设置 有关守则: private static void PrintReport(string reportFilename) { WebBrowser browser = new WebBrowser(); browser.DocumentCompleted += browser_DocumentCompleted;

我最终在没有提示用户或显示IE窗口的情况下找到了答案,但现在我需要指定份数以及其他打印机设置

有没有办法以编程方式更改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();
}

我唯一成功的方法是动态修改注册表(并将其更改回不影响任何其他内容)

您可以在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循环。

您需要通过代码更改注册表设置,以更改internet explorer或web浏览器控件的设置。查看下面的链接,它描述了如何执行此操作,如果您需要使用注册表更改更多选项,请使用regedit.exe查找internet explorer的其他键


ps:您应该注意,您通过代码对internet explorer的注册表设置所做的任何更改都将保留在您的系统/用户帐户上。

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

this.webBrowser1.ShowPrintDialog();

如果用户被非管理员锁定,这种方法有什么问题吗?我需要设置哪些注册表项?只要用户能够在“页面设置”对话框中更改设置,您就可以动态编辑注册表设置。我会查一查钥匙,把它们放在我的答案里。有没有办法通过这个方法来更改打印机的名称或打印份数?这是我真正需要做的,但是注册表项实际上只有页眉、页脚和页边距。如果没有,我会接受你的回答,强迫用户选择他们该死的打印机和份数。谢谢。这正是我在从InvokeMethod调用中删除一个空值后所需要的。很好用。那也行,但对于我3年前所需要的,它必须是完全编程的,没有用户交互。有趣的是,当我花了几个月的时间编写所有的代码来打印报告时,上级决定不允许打印,只允许查看。你能告诉我如何改变打印份数(根据OP的要求)?MSDN页面太糟糕了。它不会显示这些注册表项的实际值。它在那里所说的显然也不完全正确。有一种方法可以在全球范围内进行(部分)改变:
            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);
        }