【发布时间】:2018-11-03 06:25:02
【问题描述】:
我看到 this question 已作为 this question. 的副本关闭,除非我误解了答案,否则这两个问题对我来说都没有有效的解决方案。
我正在尝试创建 POS 样式打印。我的要求似乎很简单。
-
发送到热敏打印机(RawPrinterHelper) - 验证打印作业是否成功 (?)
-
如果失败或队列时间过长,发送到备份打印机。(RawPrinterHelper)
对于第一点和第三点,我使用了RawPrinterHelper。它工作得很好,但只要安装了打印机,SendStringToPrinter 将始终返回 true。即使打印机设置不正确,也永远无法完成打印作业。我认为我不能使用 RawPrinterHelper 进行验证。
上面链接的问题使用Win32_PrintJob 上的ManagementObjectSearcher 来轮询有关打印作业的信息。我还使用Win32_PrintJob 上的ManagementEventWatcher 来轮询新的和已删除的打印作业事件。这些解决方案在大多数情况下都适用于验证打印作业,但很少使用热敏打印机(总页数可以'不可依赖)。轮询信息以验证打印作业似乎不是最佳选择。我很容易错过信息打印测试页。
由于这些原因,ManagementObjectSearcher 和 ManagementEventWatcher 对我也不起作用。
我似乎能找到的唯一可靠解决方案是Duncan Edwards Jones here。顺便说一句,如果您遇到此问题,我会从您那里学到很多东西。 Duncan 展示了如何使用FindFirstPrinterChangeNotification 来获取有关工作状态的事件。我已经对此进行了测试,我可以说它可以很好地验证从打印队列中删除打印作业是否成功打印。
虽然 Duncans 解决方案很棒,但我需要通过它并使其 x64 与我的项目兼容,并且可能需要更多的学习和理解才能将其融入 c#。
使用 FindFirstPrinterChangeNotification 的 Duncans 方法仍然是确定打印作业是否成功离开队列的合适方法吗?
我的一部分感觉我的工作时间太早了,.NET 现在必须有解决这个问题的方法。
更新:最终用户需要安装打印机并在 Windows 中测试页面功能。我不会支持任何 Windows 无法识别的东西。
【问题讨论】:
-
是的,您在这里追求的是相当具体的东西,而热敏打印机因其出色的热敏打印机而臭名昭著。它取决于语言和固件以及您如何对其进行编程以自行处理,有时 Windows 驱动程序不知道它们。不过好在你找到了一些有用的东西,至少这是一线希望。但是我可以看到这个问题需要赏金
-
@TheGeneral 听起来这会很有趣。我明天有资格获得赏金,我将提供一个。谢谢
标签: c# printing thermal-printer printqueuewatch