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

如何在C#中读取Windows驱动菜单中DNP DS620打印机的状态信息

C# 读取DNP DS620打印机状态的实现思路

下面是经过验证的可行实现方向,可直接落地:

方案1:调用Windows底层打印API实现

  • 通用状态(卡纸、缺纸、离线、就绪等)可以直接通过.NET自带的System.Printing命名空间下的PrintQueue类读取,不需要额外依赖,代码实现最简单。
  • 厂商自定义的剩余可打印张数属于驱动扩展属性,需要通过Win32的ExtEscape API和打印机驱动直接通信获取:你可以通过API监控工具抓取官方工具运行时调用ExtEscape传入的指令参数,直接复用这套参数即可,不需要自己摸索通信协议。

方案2:复用官方工具的核心逻辑

  • 用反编译工具(如dnSpy)直接反编译官方提供的PrinterInfo工具,去掉其应用层的「打印过程中禁止使用」的判断逻辑,提取核心的状态读取代码封装成自己的类库,即可实现后台静默调用。
  • 官方工具的限制仅为应用层的逻辑判断,底层驱动本身支持任意时刻读取状态,跳过校验逻辑即可正常使用。

方案3:尝试WMI查询

  • 优先尝试遍历Win32_Printer WMI类中DNP DS620对应的对象属性,部分打印机会将自定义状态字段写入WMI扩展属性中,如果能找到对应字段,仅需几行代码即可完成所有状态读取。

基础状态读取示例代码

using System.Printing;
using System.Linq;

public static Ds620Status GetPrinterStatus()
{
    using var printServer = new LocalPrintServer();
    var ds620Queue = printServer.GetPrintQueues()
        .FirstOrDefault(q => q.Name.Contains("DNP DS620", StringComparison.OrdinalIgnoreCase));
    
    if (ds620Queue == null) return null;
    
    ds620Queue.Refresh();
    return new Ds620Status
    {
        IsPaperJam = ds620Queue.QueueStatus.HasFlag(PrintQueueStatus.PaperJam),
        IsOutOfPaper = ds620Queue.QueueStatus.HasFlag(PrintQueueStatus.OutOfPaper),
        IsOffline = ds620Queue.QueueStatus.HasFlag(PrintQueueStatus.Offline),
        IsReady = ds620Queue.QueueStatus.HasFlag(PrintQueueStatus.Ready)
        // 剩余张数可在获取ExtEscape指令后扩展此处逻辑
    };
}

public class Ds620Status
{
    public bool IsPaperJam { get; set; }
    public bool IsOutOfPaper { get; set; }
    public bool IsOffline { get; set; }
    public bool IsReady { get; set; }
    public int RemainingPages { get; set; }
}

注意事项

  • 调用底层打印相关API时,建议程序以管理员权限运行,避免权限不足导致读取失败。
  • 不同版本的打印机驱动的ExtEscape指令可能存在差异,建议优先对应自己使用的驱动版本抓取指令参数。

内容的提问来源于stack exchange,提问作者fwinterl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:21:03