【问题标题】:PInvoke GetPrinterData() to get Printer Status or ErrorsPInvoke GetPrinterData() 以获取打印机状态或错误
【发布时间】:2016-07-26 01:13:10
【问题描述】:

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

我想我可能需要调用一些 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() 或如何获取实际打印机状态的帮助都会非常有帮助。

【问题讨论】:

    标签: c# pinvoke zebra-printers


    【解决方案1】:

    虽然迟到了,但USB communications with Zebra printers in C# 的帖子展示了如何通过 USB 查询打印机。

    【讨论】:

    • 请总结一下链接的内容;简单地发布一个链接是没有帮助的。
    【解决方案2】:

    看起来,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++ 应用程序返回“错误”状态值。

    【讨论】:

      猜你喜欢
      • 2019-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多