gpt4 book ai didi

c# - 如何使用 WMI 确定连接了哪些打印机

转载 作者:太空宇宙 更新时间:2023-11-03 21:53:41 25 4
gpt4 key购买 nike

我一直在努力寻找一种方法来确定哪些已安装的打印机已“连接”。经过一些谷歌搜索后,我认为我必须深入研究 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 类的情况下做到这一点,那对我来说也很好,只要它有效。

最佳答案

我和一位同事尝试了很多方法来找到解决方案,我们认为这是可行的:

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();
}

诀窍是当打印服务器不可用时,GetPrintQueues 将抛出一些特定的异常。通过仅添加不抛出此类异常的打印机,我们可以获得所有已连接打印机的列表。这不会检查打印机是否打开/关闭,因为这实际上无关紧要。如果关闭,文档将被放入打印队列中,稍后可以打印。

我希望这可以帮助遇到此问题的其他人。

旁注:我决定不捕获该特定异常的原因是,我将不得不为该异常引用一个 dll。

关于c# - 如何使用 WMI 确定连接了哪些打印机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13285491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com