Python结合winspool.drv获取打印任务总页数问题求助
我之前也折腾过Windows下Python监控打印任务的场景,结合你提到的CristiFati代码框架和Windows打印API的逻辑,给你梳理下怎么找到总页数对应的索引:
先确认JOB_NOTIFY_FIELD_TOTAL_PAGES的数值定义
在Windows的winspool.h头文件里,JOB_NOTIFY_FIELD_TOTAL_PAGES对应的常量值是18。你可以通过ctypes直接验证:import ctypes winspool = ctypes.WinDLL("winspool.drv") print(winspool.JOB_NOTIFY_FIELD_TOTAL_PAGES) # 正常应该输出18adwData数组的索引对应规则
Windows打印API的JOB_NOTIFY_INFO_DATA结构体里,adwData数组的索引和JOB_NOTIFY_FIELD_*系列常量的数值是一一对应的。也就是说,JOB_NOTIFY_FIELD_TOTAL_PAGES的值是多少,它在adwData里的索引就是多少。所以你直接取self._NotifyData.adwData[18]就能拿到总页数。验证你的配置是否正确
要确保你在DEFAULT_FIELDS里确实添加了JOB_NOTIFY_FIELD_TOTAL_PAGES,比如:DEFAULT_FIELDS = [ # 其他已有的字段... winspool.JOB_NOTIFY_FIELD_TOTAL_PAGES, ]只有当这个字段被包含在监听列表里,系统才会把总页数数据填充到
adwData对应的位置。调试排查小技巧
如果还是拿不到正确值,建议在NotifyData方法里把整个adwData数组打印出来,对比实际打印任务的页数:def NotifyData(self, notify_data): self._NotifyData = notify_data # 打印前32个常用字段的数值 print("All adwData values:", [self._NotifyData.adwData[i] for i in range(32)]) # 尝试获取总页数 total_pages = self._NotifyData.adwData[18] print(f"Total Pages: {total_pages}")提交一个已知页数的测试打印任务(比如3页的文档),看输出里哪个数值是3,那就是你要的索引。
特殊情况处理
注意:部分老打印机或者不支持双向通信的驱动,可能不会上报总页数,这时候adwData[18]可能返回0或者无效值。这种情况你需要做容错判断,比如当数值为0时提示“无法获取总页数”。
内容的提问来源于stack exchange,提问作者Abnesis Nesis

