C# PInvoke GetPrinterData()获取打印机状态或错误
我正在尝试获取斑马标签打印机的打印机状态。我尝试了WMI,检查PrinterState、PrinterStatus、ExtendedPrinterStatus、DetectedErrorState、ExtendedDetectedErrorState,但我总是得到未知或空闲等值。打印机实际上已经没纸了,我想知道它的状态。Windows打印机区域本身也报告“就绪”状态。我安装了一个小型Zebra状态监视器应用程序,它正确地报告“没有纸” 我想我可能需要pInvoke一些Windows API来直接查询打印机。Zebra提供了一个演示GetPrinter()和GetPrinterData()用法的示例。我发现了使用GetPrinter()的方法,该方法可以工作并包含良好的信息,但状态为0,并且我没有看到任何表明纸张已用完的信息 现在,我想尝试使用GetPrinterData(),它使用并检查C# PInvoke GetPrinterData()获取打印机状态或错误,c#,pinvoke,zebra-printers,C#,Pinvoke,Zebra Printers,我正在尝试获取斑马标签打印机的打印机状态。我尝试了WMI,检查PrinterState、PrinterStatus、ExtendedPrinterStatus、DetectedErrorState、ExtendedDetectedErrorState,但我总是得到未知或空闲等值。打印机实际上已经没纸了,我想知道它的状态。Windows打印机区域本身也报告“就绪”状态。我安装了一个小型Zebra状态监视器应用程序,它正确地报告“没有纸” 我想我可能需要pInvoke一些Windows API来直接
PRINTER\u STATUS\u PAPER\u OUT
。使用它打开打印机()(这是成功的),我尝试了GetPrinterData()的一些变体。这里有一个:
uint pType = 0;
uint pcbNeeded = 0;
uint result1 = GetPrinterData(pHandle, "Error", out pType, null, 0, out pcbNeeded);
result1的值始终为2,pcbNeeded的值始终为0。即使我关闭了打印机,或者打印机有纸,我也会得到相同的值
关于如何正确使用pInvoke GetPrinterData()或如何获取打印机的实际状态的任何帮助都会非常有用。虽然对您来说已经晚了,但这篇文章展示了如何通过USB查询打印机。看起来,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);
使用UIT32代替建议的字节[]似乎返回“错误”状态值,如从C++应用程序。
请概述链接的内容;仅仅发布一个链接是没有帮助的。