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

时间:2011-06-05 22:52:08

标签: c# pinvoke zebra-printers

我正在尝试获取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()或如何获取实际打印机状态的任何帮助将非常有帮助。

2 个答案:

答案 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 ++应用程序返回“错误”状态值。