我正在尝试获取斑马标签打印机的打印机状态。我已经尝试了WMI,检查了PrinterState、PrinterStatus、ExtendedPrinterStatus、DetectedErrorState、ExtendedDetectedErrorState,但总是得到未知或空闲等值。打印机实际上没纸了,我想得到那个状态。Windows打印机区域本身也报告状态为"Ready“。我安装了一个小斑马状态监视器应用程序,它正确地报告“缺纸”。
我想我可能需要pInvoke一些Windows来直接查询打印机。Zebra有this reference,它展示了GetPrinter()和GetPrinterData()的用法。我发现使用GetPrinter()的this C# example是有效的,并且包含了良好的信息,但是它的状态是0,并且我没有看到任何指示超出纸张的内容。
现在,我想尝试使用Zebra document使用并检查PRINTER_STATUS_PAPER_OUT的GetPrinterData()方法。使用OpenPrinter()的GetPrinter() code (成功),我尝试了GetPrinterData()的一些变体。这里有一个:
uint pType = 0;
uint pcbNeeded = 0;
uint result1 = GetPrinterData(pHandle, "Error", out pType, null, 0, out pcbNeeded);result1的值始终为2,pcbNeeded的值始终为0。即使我关闭打印机,或者如果打印机有纸张,我也总是得到相同的值。
任何有关如何正确地pInvoke GetPrinterData()或如何获取实际打印机状态的帮助都将非常有帮助。
发布于 2012-10-06 05:31:58
虽然对你来说为时已晚,但post USB communications with Zebra printers in C#展示了如何通过USB查询打印机。
发布于 2016-07-26 01:13:10
看起来,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++应用程序中的“错误”状态值。
https://stackoverflow.com/questions/6246437
复制相似问题