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

6
我有一个WebBrowser控件在VB.NET WinForms应用程序中。 我能够从代码中设置默认打印机并在不提示用户的情况下打印。 但是,还有一个显示PrintDialog的打印按钮。 如果首先执行此操作,则页面将打印。 然后,如果我稍后尝试以编程方式打印(再次将默认打印机设置为其他打印机),则它将打印到PrintDialog框中选择的最后一个打印机,即使我重置了默认值并在Windows中看到默认打印机已更改。
有什么想法吗?
除非ShowPrintDialog首先选择了打印机,否则它可以正常工作。 一旦发生这种情况,无论我做什么,它似乎总是使用该打印机。
For Each strPrinter In PrinterSettings.InstalledPrinters
            If strPrinter.Contains("My Printer") Then
                wScript.SetDefaultPrinter(strPrinter)
            End If
        Next

        browser.Print()

你能展示一些代码吗?我正在尝试找出你实际调用第二个非打印对话框的位置。 - msarchet
代码已添加。我正在通过WMI设置默认打印机。调用SetDefaultPrinter后,我可以在Windows的打印机和传真中看到更改发生。然而,在执行此代码之前发生的ShowPrintDialog调用中选择的打印机仍将打印输出。在此之前有一个带有单击事件的打印按钮。所有发生的事情都是browser.ShowPrintDialog()。没有更多的东西。 - Matt
@nobugz:尝试过了,不起作用。 - Matt
2个回答

5

我能够让以下代码工作,而不需要打开/关闭单独的表单。

自从IE6以来,我一直在寻找这个...

另请参阅这两篇文章。 以编程方式更改WinForms WebBrowser控件的目标打印机

从Windows服务打印HTML文档而无需打印对话框

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

你救了我 :) 我已经寻找了许多其他的WPF Web浏览器解决方案。 - digz6666

0
我创建了一个空表单。启动/关闭此表单的操作使其进入正确的打印机...我不知道为什么会这样,但一定有一些函数可以被调用来模拟那里正在发生的任何操作。

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