C# 如何确定使用WMI连接的打印机
我一直在试图找到一种方法来确定哪些已安装的打印机是“连接”的。在谷歌搜索了几次之后,我想我必须潜入WMI 所以我建立了这个测试:C# 如何确定使用WMI连接的打印机,c#,.net,printing,wmi,C#,.net,Printing,Wmi,我一直在试图找到一种方法来确定哪些已安装的打印机是“连接”的。在谷歌搜索了几次之后,我想我必须潜入WMI 所以我建立了这个测试: // Struct to store printer data in. public struct MyPrinter { public string Availability; public string ExtendedPrinterStatus; public string Name; public string Pri
// Struct to store printer data in.
public struct MyPrinter
{
public string Availability;
public string ExtendedPrinterStatus;
public string Name;
public string PrinterStatus;
public string Status;
public string StatusInfo;
public MyPrinter(string a, string eps, string n, string ps, string s, string si)
{
Availability = a;
ExtendedPrinterStatus = eps;
Name = n;
PrinterStatus = ps;
Status = s;
StatusInfo = si;
}
}
var installedPrinters = new string[numPrinters];
PrinterSettings.InstalledPrinters.CopyTo(installedPrinters, 0);
var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Printer");
var data = new List<MyPrinter>();
foreach (var printer in searcher.Get())
{
if (installedPrinters.Contains(printer["Name"].ToString()))
{
var availability = (printer["Availability"] ?? "").ToString();
var extendedPrinterStatus = (printer["ExtendedPrinterStatus"] ?? "").ToString();
var name = (printer["Name"] ?? "").ToString();
var printerStatus = (printer["PrinterStatus"] ?? "").ToString();
var status = (printer["Status"] ?? "").ToString();
var statusInfo = (printer["StatusInfo"] ?? "").ToString();
data.Add(new MyPrinter(availability, extendedPrinterStatus, name, printerStatus, status, statusInfo));
}
}
因此,打印机之间的唯一区别是名称。
我再次运行了脚本,但这次我断开了笔记本电脑与网络的连接。因此,在本例中,有2台打印机不再连接
对我来说奇怪的是,结果完全一样
我运行此测试的原因是,为了找出我的案例需要使用的字段
因此,在最后,我还无法确定如何确定打印机是否连接。
因此,我想要的是一种在C中找出已安装的+已连接打印机的方法。如果有一种方法可以不使用WMI类,我也可以,只要它有效。我和一位同事尝试了很多方法来找到解决方案,我们认为这是有效的:
private string[] GetAvailablePrinters()
{
var installedPrinters = new string[PrinterSettings.InstalledPrinters.Count];
PrinterSettings.InstalledPrinters.CopyTo(installedPrinters, 0);
var printers = new List<string>();
var printServers = new List<string>();
var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Printer");
foreach (var printer in searcher.Get())
{
var serverName = @"\\" + printer["SystemName"].ToString().TrimStart('\\');
if (!printServers.Contains(serverName))
printServers.Add(serverName);
}
foreach (var printServer in printServers)
{
var server = new PrintServer(printServer);
try
{
var queues = server.GetPrintQueues();
printers.AddRange(queues.Select(q => q.Name));
}
catch (Exception)
{
// Handle exception correctly
}
}
return printers.ToArray();
}
诀窍在于,当printserver不可用时,GetPrintQueues将抛出一些特定的异常。通过只添加不引发此类异常的打印机,我们可以获得所有已连接打印机的列表。这并不检查打印机是否打开/关闭,因为这实际上并不重要。如果关闭该选项,文档将被放置在打印队列中,稍后可以打印
我希望这能帮助其他遇到这个问题的人
旁注:
我决定不捕获该特定异常的原因是,我必须仅为该异常引用dll。我和一位同事尝试了很多方法来找到解决方案,我们认为这是可行的:
private string[] GetAvailablePrinters()
{
var installedPrinters = new string[PrinterSettings.InstalledPrinters.Count];
PrinterSettings.InstalledPrinters.CopyTo(installedPrinters, 0);
var printers = new List<string>();
var printServers = new List<string>();
var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Printer");
foreach (var printer in searcher.Get())
{
var serverName = @"\\" + printer["SystemName"].ToString().TrimStart('\\');
if (!printServers.Contains(serverName))
printServers.Add(serverName);
}
foreach (var printServer in printServers)
{
var server = new PrintServer(printServer);
try
{
var queues = server.GetPrintQueues();
printers.AddRange(queues.Select(q => q.Name));
}
catch (Exception)
{
// Handle exception correctly
}
}
return printers.ToArray();
}
诀窍在于,当printserver不可用时,GetPrintQueues将抛出一些特定的异常。通过只添加不引发此类异常的打印机,我们可以获得所有已连接打印机的列表。这并不检查打印机是否打开/关闭,因为这实际上并不重要。如果关闭该选项,文档将被放置在打印队列中,稍后可以打印
我希望这能帮助其他遇到这个问题的人
旁注:
我决定不捕获该特定异常的原因是,我必须仅为该异常引用dll。看起来与这个问题相同:不是真的。这是关于虚拟打印机的,而这是关于连接打印机的。看起来和这个问题相同:不是真的。这是关于虚拟打印机的,而这是关于连接打印机的。这不是忽略异常的好理由。养成非常坏的习惯。我从来没有说过我“忽略”例外!我指的是空的CatchException块。啊,对不起,我在写这篇文章的时候没有用它做任何事情,因为那不是我的目标。一、 当然,最后没有留下空白。读者阅读我们发布的代码。许多人会认为你的意思是忽略异常,并会复制这些代码。我建议,如果您不想在代码示例中演示异常处理,只需完全忽略try/catch即可。这不是忽略异常的一个很好的理由。养成非常坏的习惯。我从来没有说过我“忽略”例外!我指的是空的CatchException块。啊,对不起,我在写这篇文章的时候没有用它做任何事情,因为那不是我的目标。一、 当然,最后没有留下空白。读者阅读我们发布的代码。许多人会认为你的意思是忽略异常,并会复制这些代码。我建议,如果您不想在代码示例中演示异常处理,只需完全忽略try/catch。