You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据选定打印机名称获取进纸器及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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:52:13