C# 设置默认值后,从WebBrowser控件打印到错误的打印机
我在VB.NET WinForms应用程序中有一个WebBrowser控件。我可以从代码和打印设置默认打印机,而无需提示用户。但是,还有一个显示PrintDialog的print按钮。如果先执行此操作,页面将打印。然后,如果我稍后尝试以编程方式打印(再次将默认打印机设置为其他打印机),它将打印到在“打印”对话框中选择的最后一台打印机,即使我正在重置默认打印机并在Windows中看到默认打印机正在更改 有什么想法吗 除非ShowPrintDialog首先选择了打印机,否则它可以正常工作。一旦发生这种情况,无论我做什么,它似乎总是使用那台打印机C# 设置默认值后,从WebBrowser控件打印到错误的打印机,c#,.net,vb.net,winforms,webbrowser-control,C#,.net,Vb.net,Winforms,Webbrowser Control,我在VB.NET WinForms应用程序中有一个WebBrowser控件。我可以从代码和打印设置默认打印机,而无需提示用户。但是,还有一个显示PrintDialog的print按钮。如果先执行此操作,页面将打印。然后,如果我稍后尝试以编程方式打印(再次将默认打印机设置为其他打印机),它将打印到在“打印”对话框中选择的最后一台打印机,即使我正在重置默认打印机并在Windows中看到默认打印机正在更改 有什么想法吗 除非ShowPrintDialog首先选择了打印机,否则它可以正常工作。一旦发生这
For Each strPrinter In PrinterSettings.InstalledPrinters
If strPrinter.Contains("My Printer") Then
wScript.SetDefaultPrinter(strPrinter)
End If
Next
browser.Print()
我创建了一个没有任何内容的表单。启动/关闭此表单的操作使其转到正确的打印机。。。我不知道为什么会这样,但一定有一些函数可以被调用来模拟那里正在发生的任何动作。我能够让下面的代码工作,而不必打开/关闭单独的表单。 我从IE6开始就一直在找这个 另见这两篇文章。
你能给我看一些代码吗?我想知道你到底在哪里调用第二个非打印对话框PrintCodeAdded。我正在通过WMI设置默认打印机。调用SetDefaultPrinter后,我看到windows中的打印机和传真发生了更改。但是,它将打印到之前从ShowPrintDialog调用中选择的打印机,该调用在执行此代码之前发生。在此之前,有一个带有单击事件的打印按钮。在那里发生的只是browser.ShowPrintDialog()。没什么了。@nobugz:试过了,但没用。你救了我:)我已经为WPF web浏览器找到了许多其他的解决方案。
// 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;
}
}
}