如何根据选定打印机名称获取进纸器及PaperSource
获取Windows已安装打印机的进纸器(PaperSource)信息
当前实现代码
我在Windows客户端用ListBox展示所有可找到的打印机,代码如下:
List<MyPrinterClass> lstPrinters = new List<MyPrinterClass>(); foreach (var item in PrinterSettings.InstalledPrinters) { MyPrinterClass d = new MyPrinterClass(); d.printerName = item.ToString(); lstPrinters.Add(d); }
自定义类定义
我目前定义的类:
public class MyPrinterClass { public string imageSource { get; set; } public Bitmap imageBmp { get; set; } public string printerName { get; set; } public List<PaperSource> paperSources { get; set; } }
问题说明
我需要获取打印机的进纸器(trays)以及对应的PaperSource信息(如果打印机支持的话)。已知客户端已安装目标打印机,Windows系统应该能获取到这些进纸器和PaperSource的详细数据。
已尝试的方法
- 通过
PrinterSettings.InstalledPrinters只能获取打印机名称,无法访问其他数据 - 通过
PrintDocument的PrinterSettings.PaperSources能获取PaperSource,但这些数据和ListBox中选中的已安装打印机不关联
期望
拥有一个类似微软通用Windows打印示例的打印机类。
可选方案
开发通用Windows解决方案并传递数据,但这是我最不想选的方式。
解决方法
要关联打印机名称和对应的PaperSource,你可以为每个已安装的打印机单独创建PrinterSettings实例,指定其PrinterName属性后,就能获取该打印机的PaperSources:
List<MyPrinterClass> lstPrinters = new List<MyPrinterClass>(); foreach (string printerName in PrinterSettings.InstalledPrinters) { MyPrinterClass printer = new MyPrinterClass(); printer.printerName = printerName; // 创建对应打印机的PrinterSettings实例 PrinterSettings settings = new PrinterSettings(); settings.PrinterName = printerName; // 将PaperSources转换为List并赋值 printer.paperSources = settings.PaperSources.Cast<PaperSource>().ToList(); lstPrinters.Add(printer); }
注意事项
- 某些打印机可能需要额外权限才能访问详细设置,确保程序有足够的权限
- 可以添加空值判断,避免因打印机设置异常导致的报错
- 如果需要获取打印机图标,可通过Win32 API调用
GetPrinter函数获取,.NET自带的PrinterSettings没有直接提供图标获取方法
内容的提问来源于stack exchange,提问作者Philipp
相关产品推荐
相关产品推荐

