PInvoke GetPrinterData (), чтобы получить состояние принтера или ошибки - PullRequest
0 голосов
/ 06 июня 2011

Я пытаюсь получить статус принтера принтера этикеток Zebra. Я пробовал WMI, проверял PrinterState, PrinterStatus, ExtendedPrinterStatus, DetectedErrorState, ExtendedDetectedErrorState, но я всегда получаю такие значения, как Unknown или Idle. В принтере фактически нет бумаги, и я хочу получить этот статус. Сама область «Принтеры Windows» также сообщает о состоянии «Готово». Я установил небольшое приложение Zebra Status Monitor, и оно правильно сообщает «Нет бумаги».

Я думаю, мне может понадобиться вызвать некоторые API-интерфейсы Windows, чтобы напрямую запросить принтер. У Zebra эта ссылка , которая показывает использование GetPrinter () и GetPrinterData (). Я нашел этот пример C # использования GetPrinter (), который работает и содержит полезную информацию, но Status равен 0, и я не вижу ничего, что указывает на отсутствие бумаги.

Теперь я хотел бы попытаться использовать GetPrinterData (), который этот документ Zebra использует и проверяет на 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 () или о том, как получить фактическое состояние принтера.

Ответы [ 2 ]

0 голосов
/ 25 июля 2016

Как представляется, объявление pinvoke.net для GetPrinterData правильное, но работает не всегда.Если вы измените объявление на:

    [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 вместо предложенного байта [], похоже, возвращает значения состояния «Ошибка» как из приложения C ++.

0 голосов
/ 06 октября 2012

Хотя для вас уже поздно, в сообщении USB с принтерами Zebra в C # показано, как запрашивать принтер через USB.

...