首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PInvoke GetPrinterData()获取打印机状态或错误

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

Stack Overflow用户
提问于 2011-06-06 06:52:08
回答 2查看 3.1K关注 0票数 0

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

我想我可能需要pInvoke一些Windows来直接查询打印机。Zebra有this reference,它展示了GetPrinter()和GetPrinterData()的用法。我发现使用GetPrinter()的this C# example是有效的,并且包含了良好的信息,但是它的状态是0,并且我没有看到任何指示超出纸张的内容。

现在,我想尝试使用Zebra document使用并检查PRINTER_STATUS_PAPER_OUT的GetPrinterData()方法。使用OpenPrinter()的GetPrinter() code (成功),我尝试了GetPrinterData()的一些变体。这里有一个:

代码语言:javascript
复制
uint pType = 0;
uint pcbNeeded = 0;
uint result1 = GetPrinterData(pHandle, "Error", out pType, null, 0, out pcbNeeded);

result1的值始终为2,pcbNeeded的值始终为0。即使我关闭打印机,或者如果打印机有纸张,我也总是得到相同的值。

任何有关如何正确地pInvoke GetPrinterData()或如何获取实际打印机状态的帮助都将非常有帮助。

EN

回答 2

Stack Overflow用户

发布于 2012-10-06 05:31:58

虽然对你来说为时已晚,但post USB communications with Zebra printers in C#展示了如何通过USB查询打印机。

票数 0
EN

Stack Overflow用户

发布于 2016-07-26 01:13:10

看起来,GetPrinterData的pinvoke.net声明是正确的,但并不总是有效。如果将声明更改为:

代码语言:javascript
复制
    [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++应用程序中的“错误”状态值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6246437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档