我正在尝试获取Zebra标签打印机的打印机状态。我已经尝试过WMI,检查PrinterState,PrinterStatus,ExtendedPrinterStatus,DetectedErrorState,ExtendedDetectedErrorState,但我总是得到诸如Unknown或Idle之类的值。打印机实际上没纸了,我想获得这种状态。 Windows打印机区域本身也报告状态为“就绪”。我安装了一个小的Zebra Status Monitor应用程序,它正确报告“Out of Paper”。
我想我可能需要pInvoke一些Windows API来直接查询打印机。 Zebra有this reference,它显示了GetPrinter()和GetPrinterData()的使用。我找到this C# example使用GetPrinter()工作并包含好信息,但状态为0,我没有看到任何表明缺纸的东西。
现在,我想尝试使用Zebra document使用的GetPrinterData()并检查PRINTER_STATUS_PAPER_OUT
。使用GetPrinter() code到OpenPrinter()(这是成功的),我尝试了一些GetPrinterData()变体。这是一个:
uint pType = 0;
uint pcbNeeded = 0;
uint result1 = GetPrinterData(pHandle, "Error", out pType, null, 0, out pcbNeeded);
result1的值始终为2,pcbNeeded的值为0.即使关闭打印机,或者打印机有纸,我也总是得到相同的值。
有关如何正确pInvoke GetPrinterData()或如何获取实际打印机状态的任何帮助将非常有帮助。
答案 0 :(得分:0)
虽然时间已晚,但帖子USB communications with Zebra printers in C#显示了如何通过USB查询打印机。
答案 1 :(得分:0)
因为看起来getPrinterData的pinvoke.net声明是正确的但是不能一直工作。如果您将声明更改为:
[DllImport("winspool.drv",
SetLastError = true,
CharSet = CharSet.Ansi,
CallingConvention = CallingConvention.StdCall)]
static extern uint GetPrinterData(
IntPtr hPrinter,
string pValueName,
out uint pType,
out UInt32 pData,
uint nSize,
out uint pcbNeeded);
使用UInt32而不是建议的byte []似乎从C ++应用程序返回“错误”状态值。