C# PInvoke GetPrinterData()获取打印机状态或错误

C# PInvoke GetPrinterData()获取打印机状态或错误,c#,pinvoke,zebra-printers,C#,Pinvoke,Zebra Printers,我正在尝试获取斑马标签打印机的打印机状态。我尝试了WMI,检查PrinterState、PrinterStatus、ExtendedPrinterStatus、DetectedErrorState、ExtendedDetectedErrorState,但我总是得到未知或空闲等值。打印机实际上已经没纸了,我想知道它的状态。Windows打印机区域本身也报告“就绪”状态。我安装了一个小型Zebra状态监视器应用程序,它正确地报告“没有纸” 我想我可能需要pInvoke一些Windows API来直接

我正在尝试获取斑马标签打印机的打印机状态。我尝试了WMI,检查PrinterState、PrinterStatus、ExtendedPrinterStatus、DetectedErrorState、ExtendedDetectedErrorState,但我总是得到未知或空闲等值。打印机实际上已经没纸了,我想知道它的状态。Windows打印机区域本身也报告“就绪”状态。我安装了一个小型Zebra状态监视器应用程序,它正确地报告“没有纸”

我想我可能需要pInvoke一些Windows API来直接查询打印机。Zebra提供了一个演示GetPrinter()和GetPrinterData()用法的示例。我发现了使用GetPrinter()的方法,该方法可以工作并包含良好的信息,但状态为0,并且我没有看到任何表明纸张已用完的信息

现在,我想尝试使用GetPrinterData(),它使用并检查
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++应用程序。

请概述链接的内容;仅仅发布一个链接是没有帮助的。