我已经看到这个问题作为这个问题的重复而关闭。除非我误解了答案,否则这两个问题对我来说都没有有效的解决方案。
我正在尝试创建 POS 样式打印。我的要求似乎很简单。
发送到热敏打印机(RawPrinterHelper)- 验证打印作业成功 (?)
如果失败或队列时间过长,发送到备份打印机。(原始打印机助手)
对于第一点和第三点,我使用了RawPrinterHelper。它工作得很好,但SendStringToPrinter
只要安装了打印机,它就会始终返回 true。即使打印机设置不正确,也永远无法完成打印作业。我认为我不能使用 RawPrinterHelper 进行验证。
上面链接的问题使用ManagementObjectSearcher来Win32_PrintJob
轮询有关打印作业的信息。我还使用了ManagementEventWatcher来Win32_PrintJob
轮询新的和已删除的打印作业事件。这些解决方案适用于在大多数情况下验证打印作业,但很少使用热敏打印机(不能依赖总页数)。轮询信息以验证打印作业似乎不是最佳选择。我很容易错过信息打印测试页。
由于这些原因,ManagementObjectSearcher 和 ManagementEventWatcher 也不会为我解决问题。
我似乎能找到的唯一可靠的解决方案是由Duncan Edwards Jones 提供的。顺便说一句,如果您遇到此问题,我会从您那里学到很多东西。Duncan 展示了如何使用FindFirstPrinterChangeNotification
获取有关作业状态的事件。我已经对此进行了测试,我可以说它可以很好地验证从打印队列中删除打印作业是否已成功打印。
尽管 Duncans 解决方案很棒,但我需要通过它并使其与我的项目兼容 x64,并且可能需要做更多的学习和理解才能将其融入 c#。
使用 FindFirstPrinterChangeNotification 的 Duncans 方法是否仍然是确定打印作业是否成功离开队列的合适方法?
我的一部分感觉我的工作时间太早了,.NET 现在必须有解决这个问题的方法。
更新:最终用户需要在 Windows 中安装打印机并测试页面功能。我不会支持任何 Windows 无法识别的东西。