2010-04-01 3 views
4

VB.NET WinForms 응용 프로그램에 WebBrowser 컨트롤이 있습니다. 기본 프린터를 코드에서 설정하고 사용자에게 메시지를 표시하지 않고 인쇄 할 수 있습니다. 그러나 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

다시 만듭니다 제어. –

+0

몇 가지 코드를 보여 주시겠습니까, 나는 실제로 두 번째 아닌 인쇄 대화 상자 인쇄 – msarchet

+0

코드를 호출하는 알아 내려고 노력하고있어. WMI를 통해 기본 프린터를 설정하고 있습니다. SetDefaultPrinter를 호출 한 후에 Windows의 프린터 및 팩스에서 변경 사항이 발생합니다. 그러나이 코드가 실행되기 전에 발생한 ShowPrintDialog 호출에서 이전에 선택된 프린터로 인쇄됩니다. 이전에는 클릭 이벤트가있는 인쇄 버튼이 있습니다. 거기서 일어나는 모든 일은 browser.ShowPrintDialog()입니다. 아무것도 더. – Matt

답변

0

나는 아무것도 작성하지 않은 양식을 만들었습니다. 이 양식을 시작/닫는 동작은 올바른 프린터로 이동하게 만들었습니다 ... 왜 작동하는지 모르지만 어떤 작업이 발생했는지 시뮬레이션하기 위해 호출 할 수있는 기능이 있어야합니다.

4

별도의 양식을 열거 나 닫지 않고도 다음 코드를 사용할 수있었습니다. 나는 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

관련 문제