0

我正在尝试获取 Zebra 标签打印机的打印机状态。我试过 WMI,检查 PrinterState、PrinterStatus、ExtendedPrinterStatus、DetectedErrorState、ExtendedDetectedErrorState,但我总是得到诸如 Unknown 或 Idle 之类的值。打印机实际上没有纸了,我想得到那个状态。Windows 打印机区域本身也报告“就绪”状态。我安装了一个小型 Zebra Status Monitor 应用程序,它正确报告“缺纸”。

我想我可能需要 pInvoke 一些 Windows API 来直接查询打印机。Zebra 有此参考资料,其中显示了 GetPrinter() 和 GetPrinterData() 的用法。我发现了这个使用 GetPrinter() 的 C# 示例,它可以工作并包含很好的信息,但是状态为 0,我没有看到任何表明缺纸的内容。

现在,我想尝试使用Zebra 文档使用的 GetPrinterData()并检查PRINTER_STATUS_PAPER_OUT. 将GetPrinter() 代码用于 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() 或如何获取实际打印机状态的任何帮助都将非常有帮助。

4

2 回答 2

0

虽然为时已晚,但在 C# 中与 Zebra 打印机进行 USB 通信后显示了如何通过 USB 查询打印机。

于 2012-10-05T21:31:57.760 回答
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++ 应用程序返回“错误”状态值。

于 2016-07-25T17:13:10.090 回答