打印从WebBrowser控件打印到错误的打印机后设置默认

问题描述:

我有一个WebBrowser控件在VB.NET WinForms应用程序。我能够从代码设置默认打印机并打印而不会提示用户。但是,还有一个显示PrintDialog的打印按钮。如果此操作先完成,则页面将打印。然后,如果我尝试以后以编程方式打印(再次将默认打印机设置为某个其他打印机),即使我重置默​​认设置并查看在Windows中更改的默认打印机,它将打印到PrintDialog框中选定的最后一台打印机。打印从WebBrowser控件打印到错误的打印机后设置默认

任何想法?

它工作正常,除非ShowPrintDialog首先选择了打印机。一旦发生这种情况,无论我做什么,似乎都会使用该打印机。

For Each strPrinter In PrinterSettings.InstalledPrinters 
      If strPrinter.Contains("My Printer") Then 
       wScript.SetDefaultPrinter(strPrinter) 
      End If 
     Next 

     browser.Print() 
+0

重新创建控制。 – 2010-04-01 16:26:41

+0

请问您能否显示一些代码,我试图找出您实际调用第二个非打印对话框打印 – msarchet 2010-04-01 17:15:05

+0

代码的位置。我正在通过WMI设置默认打印机。在调用SetDefaultPrinter后,我看到在Windows打印机和传真中发生了变化。然而,它将打印输出到之前从执行此代码之前发生的ShowPrintDialog调用中选择的打印机。 在此之前,有一个打印按钮与点击事件。所有发生在那里的是browser.ShowPrintDialog()。而已。 – Matt 2010-04-01 17:35:32

我创建了一个没有任何东西的窗体。启动/关闭此表单的操作使其转到了正确的打印机上......我不知道为什么这会起作用,但必须有一些函数可以调用来模拟在此发生的任何操作。

我能够得到下面的代码工作,而不必打开/关闭一个单独的表单。 自IE6以来,我一直在寻找这个...

另请参阅这两个职位。 Programmatically changing the destination printer for a WinForms WebBrowser control

Print html document from Windows Service without print dialog

// Add references for: COM: Microsoft Internet Controls; .NET: System.Management.dll 
using System; 
using System.Reflection; 
using System.Threading; 
using SHDocVw; 
using System.Windows.Controls; 
using System.Management; 

namespace HTMLPrinting 
{ 
    public class HTMLPrinter 
    { 
     private bool documentLoaded; 
     private bool documentPrinted; 
     private string originalDefaultPrinterName; 

     private void ie_DocumentComplete(object pDisp, ref object URL) 
     { 
     documentLoaded = true; 
     } 

     private void ie_PrintTemplateTeardown(object pDisp) 
     { 
     documentPrinted = true; 
     } 

     public void Print(string htmlFilename, string printerName) 
     { 
     // Preserve default printer name 
     originalDefaultPrinterName = GetDefaultPrinterName(); 
     // set new default printer 
     SetDefaultPrinter(printerName); 
     // print to printer 
     Print(htmlFilename); 
     } 

     public void Print(string htmlFilename) 
     { 
     documentLoaded = false; 
     documentPrinted = false; 

     InternetExplorer ie = new InternetExplorer(); 
     ie.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(ie_DocumentComplete); 
     ie.PrintTemplateTeardown += new DWebBrowserEvents2_PrintTemplateTeardownEventHandler(ie_PrintTemplateTeardown); 

     object missing = Missing.Value; 

     ie.Navigate(htmlFilename, ref missing, ref missing, ref missing, ref missing); 
     while (!documentLoaded && ie.QueryStatusWB(OLECMDID.OLECMDID_PRINT) != OLECMDF.OLECMDF_ENABLED) 
      Thread.Sleep(100); 

     ie.ExecWB(OLECMDID.OLECMDID_PRINT, OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref missing, ref missing); 

     // Wait until the IE is done sending to the printer 
     while (!documentPrinted) 
      Thread.Sleep(100); 

     // Remove the event handlers 
     ie.DocumentComplete -= ie_DocumentComplete; 
     ie.PrintTemplateTeardown -= ie_PrintTemplateTeardown; 
     ie.Quit(); 

     // reset to original default printer if needed 
     if (GetDefaultPrinterName() != originalDefaultPrinterName) 
     { 
      SetDefaultPrinter(originalDefaultPrinterName); 
     } 
     } 

     public static string GetDefaultPrinterName() 
     { 
     var query = new ObjectQuery("SELECT * FROM Win32_Printer"); 
     var searcher = new ManagementObjectSearcher(query); 

     foreach (ManagementObject mo in searcher.Get()) 
     { 
      if (((bool?)mo["Default"]) ?? false) 
      { 
       return mo["Name"] as string; 
      } 
     } 

     return null; 
     } 

     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 true; 
     } 
    } 
} 
+0

你救了我:)我看了很多其他解决方案的WPF网页浏览器。 – digz6666 2014-11-17 10:55:28