2011-06-05 43 views
0

我试图获取Zebra标签打印机的打印机状态。我试过WMI,检查PrinterState,PrinterStatus,ExtendedPrinterStatus,DetectedErrorState,ExtendedDetectedErrorState,但我总是得到诸如Unknown或Idle等值。打印机实际上没有纸张,我想获得该状态。 Windows打印机区域本身也报告“就绪”状态。我安装了一个小型斑马状态监视器应用程序,并正确报告“缺纸”。PInvoke GetPrinterData()获取打印机状态或错误

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

现在,我想尝试使用GetPrinterData(),其中Zebra document使用并检查PRINTER_STATUS_PAPER_OUT。使用​​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()或如何获得实际的打印机状态的帮助将是非常有用的。

回答

0

因为它看起来像GetPrinterData的pinvoke.net声明是正确的,但并不是一直工作。如果更改声明:使用UInt32的

[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); 

,而不是建议的字节[]似乎返回“错误”状态值从C++应用程序。