为何使用PrintServer.GetPrintQueues无法检测到PC上的网络打印机?
如何正确检测本地PC上的网络打印机
我需要检测本地PC上的网络打印机,尝试了以下代码,但返回结果为空:
PrintQueueCollection networkQueues; using (var printServer = new PrintServer()) { var flags = new[] { EnumeratedPrintQueueTypes.Shared, EnumeratedPrintQueueTypes.Connections }; networkQueues = printServer.GetPrintQueues(flags); }
但实际本地有两台网络打印机,通过以下代码可以检测到所有已安装的打印机(包括这两台网络打印机):
var printerNames = PrinterSettings.InstalledPrinters;
问题原因
PrintServer.GetPrintQueues的EnumeratedPrintQueueTypes.Connections仅识别通过打印服务器共享的网络打印机,如果你的网络打印机是直接通过TCP/IP端口安装的(本地直连的网络设备,而非域打印服务器共享的),这个枚举值无法匹配这类打印机。而PrinterSettings.InstalledPrinters会列出系统中所有已安装的打印机,无论类型,所以能正常显示目标设备。
解决方案
可以先获取所有已安装的打印机,再筛选出网络打印机:
方法1:使用PrinterSettings筛选
List<string> networkPrinterNames = new List<string>(); foreach (string printerName in PrinterSettings.InstalledPrinters) { using (PrinterSettings settings = new PrinterSettings()) { settings.PrinterName = printerName; if (!settings.IsLocal && settings.IsNetwork) { networkPrinterNames.Add(printerName); } } }
方法2:结合PrintQueue获取详细信息
List<PrintQueue> networkPrintQueues = new List<PrintQueue>(); foreach (string printerName in PrinterSettings.InstalledPrinters) { try { using (PrintQueue queue = new PrintQueue(new PrintServer(), printerName)) { if (!queue.IsLocal) { networkPrintQueues.Add(queue); } } } catch (Exception ex) { Console.WriteLine($"无法读取打印机 {printerName} 信息: {ex.Message}"); } }
内容的提问来源于stack exchange,提问作者Fabrizio Ciavatta
相关产品推荐
相关产品推荐

