簡體   English   中英

設置默認值后,從WebBrowser控件打印將打印到錯誤的打印機

[英]Printing From WebBrowser control prints to wrong printer after setting default

我在VB.NET WinForms應用程序中有一個WebBrowser控件。 我可以通過代碼設置默認打印機並在不提示用戶的情況下進行打印。 但是,還有一個打印按鈕顯示PrintDialog。 如果先執行此操作,則將打印頁面。 然后,如果我稍后嘗試以編程方式打印(再次將默認打印機設置為其他打印​​機),即使我正在重置默認值並看到Windows中默認打印機的更改,它也將打印到PrintDialog框中選擇的最后一個打印機。

有任何想法嗎?

除非ShowPrintDialog首先選擇了打印機,否則它將正常工作。 一旦發生這種情況,無論我做什么,似乎總是使用該打印機。

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

        browser.Print()

我能夠獲得以下代碼,而不必打開/關閉單獨的表單。 自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;
      }
   }
}

我創建了一個沒有任何內容的表單。 啟動/關閉此表單的動作使它進入正確的打印機...我不知道為什么會起作用,但是必須調用某些函數來模擬在那里發生的任何行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM