我一直在试图找到一种方法来确定哪些已安装的打印机是“连接的”。经过一番谷歌搜索后,我想我必须深入研究 WMI。
所以我建立了这个测试:
// 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));
}
}
我有 6 台打印机,其中 2 台是网络打印机。我已经在连接所有打印机的情况下运行此程序,所有结果如下所示:
Availability = "" // printer["Availability"] = null
ExtendedPrinterStatus = "2" // 2 = Unknown
Name = "{printer name here}"
PrinterStatus = "3" // 3 = Idle
Status = "Unknown"
StatusInfo = "" // Null
所以打印机之间的唯一区别是名称。我再次运行脚本,但这次我断开了笔记本电脑与网络的连接。因此,在这种情况下,2 台打印机不再连接。
奇怪的是(对我来说)结果是完全一样的。
我运行此测试的原因是,找出我需要为我的案例使用哪个字段。
所以最后,我无法弄清楚如何确定打印机是否连接。所以我想要的是一种在 C# 中找出已安装 + 连接的打印机的方法。如果有一种方法可以在不使用 WMI 类的情况下做到这一点,那么我也可以,只要它有效。