【问题标题】:Python win32print printer status confusionPython win32print 打印机状态混乱
【发布时间】:2012-08-20 16:41:30
【问题描述】:

我一直在使用 Python 的 win32print 模块来尝试获取有关打印机集的各种信息,例如驱动程序名称、作业计数、正在使用的端口、状态等。它大多是成功的,但是我在使用 win32print 从 API 返回的状态码时遇到很多麻烦。

我一直在使用 win32print.GetPrinter 方法,它返回一个 PRINTER_INFO_ 字典,其中一个映射是 Status。但是,没有记录什么状态代码对应于什么打印机状态。好像0是空闲的,1是暂停的,除此之外我不知道是什么意思。

当我查找 Windows 32 位 API 的常量值时,我找到了 this page,但我得到的所有状态代码似乎都与此匹配。很多时候,我得到一个像 1052800 这样的状态码(从 Epson 打印机得到的),它不在 win32api 常量的列表中。

我也尝试过使用 WMI 模块来做到这一点,但成功率更低。

我想获取打印机缺纸、打印机门打开、碳粉不足、卡纸等的打印机状态代码。有没有人知道在哪里可以找到这些状态代码的含义,甚至是更好的解决方案完全找到打印机状态?

【问题讨论】:

    标签: python windows winapi printing wmi


    【解决方案1】:

    返回的状态是一个位掩码,例如here。多个值可以一起进行或运算,因此您的值 1052800(十六进制 0x101080)表示打印机具有(所有)状态;

    • PRINTER_STATUS_USER_INTERVENTION
    • PRINTER_STATUS_NOT_AVAILABLE
    • PRINTER_STATUS_OFFLINE

    【讨论】:

    • GetPrinter 返回一个元组,那么哪一项是位掩码?
    【解决方案2】:

    我想分享我在 Windows 10 中检查打印机是否离线的经验。 win32print.GetPrinter 中的 PRINTER_INFO_2 中的状态标志对我不起作用,因为对于所有已安装的打印机,它始终为 0。 感谢this stackoverflow discussion for C++,我发现打印机属性中的PRINTER_ATTRIBUTE_WORK_OFFLINE 标志可以表示打印机是否处于离线状态。

    handle = win32print.OpenPrinter(printer_name)   
    attributes = win32print.GetPrinter(handle)[13]
    print(f'{printer_name} is offline? :{(attributes & 0x00000400) >> 10}')
    

    [13] 是返回元组中的属性位置。 microsoft doc
    0x00000400 是PRINTER_ATTRIBUTE_WORK_OFFLINE 的十六进制代码。 microsoft doc

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-03
      • 2011-07-30
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      • 2011-11-18
      • 2015-07-26
      相关资源
      最近更新 更多