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

Posted

技术标签:

【中文标题】如何使用 WebBrowser 控件以编程方式更改打印机设置?【英文标题】:How do I programmatically change printer settings with the WebBrowser control? 【发布时间】:2010-10-17 09:39:54 【问题描述】:

我终于在没有提示用户或显示 IE 窗口的情况下找到了how to print transformed 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();

【问题讨论】:

【参考方案1】:

我唯一成功的方法是即时修改注册表(并将它们改回不影响其他任何内容)。

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

【讨论】:

如果用户被锁定为非管理员,这种方法有什么问题吗?我需要设置哪些注册表项? 只要用户能够更改“页面设置”对话框中的设置,您就可以即时编辑注册表设置。我会查找密钥并将它们放入我的答案中。 有什么方法可以通过该方法更改打印机名称或份数?这就是我真正需要做的,但注册表项只有真正的页眉、页脚和边距。如果没有,我会继续接受你的回答,并强迫用户选择他们该死的打印机和份数。 谢谢。从 InvokeMethod 调用中删除一个空值后,这正是我所需要的。完美运行。【参考方案2】:
            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);
        

【讨论】:

您能否展示如何更改要打印的份数(根据 OP 的要求)?【参考方案3】:

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

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

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

【讨论】:

那个 MSDN 页面太糟糕了。它不显示这些注册表项的实际值。它在那里所说的显然也不完全正确。有一种方法可以做(其中一些)无需在全球范围内进行更改:support.microsoft.com/en-us/kb/267240【参考方案4】:

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

this.webBrowser1.ShowPrintDialog();

【讨论】:

这也可以,但是对于我 3 年前所需要的,它必须是完全程序化的,没有用户交互。有趣的是,当我花了几个月的时间编写所有代码来打印报表时,上级决定不允许打印,只允许查看。

以上是关于如何使用 WebBrowser 控件以编程方式更改打印机设置?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 HTMLElement 以编程方式单击链接元素?

如何使用 MFC 以编程方式更改 ActiveX 控件的属性?

当我以编程方式更改用户控件时,如何让数据绑定双向工作?

如何以编程方式从控件自己的更改事件中更改选择框选择并使其在移动浏览器中工作

WinForm中用WebBrowser控件显示Excel文件,显示失败

更改 WebBrowser 控件的用户代理