尝试确定离线和在线打印机的打印机状态总是 returns 0

Trying to determine printer status always returns 0 for offline & online printers

我的目标是确定打印机的当前状态。我找到了 following code。这是一个稍微修改过的版本,用于修复内存泄漏和错误:

#include <Winspool.h>

int GetPrinterStatus( char* szPrnName )
{
  HANDLE          hHandle = 0;   // Handle of the printer

  DWORD           dwStatus = 0;  // Printer status we should receive

  DWORD           dwSize = 0;    // Size of memory we should
                                 // allocate for PRINTER_INFO_2

  PRINTER_INFO_2* pPrnInfo2 = 0; // Structure specifies detailed
                                 // printer information

  DEVMODE         DevMode = {0}; // Structure contains information
                                 // about the device initialization
                                 // and environment of a printer

  PRINTER_DEFAULTS PrnDef = { 0, &DevMode, PRINTER_ACCESS_USE };

  // Open printer with name szPrnName
  if( !OpenPrinter( szPrnName, &hHandle, &PrnDef ) )
    return -1; // Error

  // How many memory should be allocated for printer data?
  GetPrinter( hHandle, 2, 0, 0, &dwSize );
  if( !dwSize )
  {
    ClosePrinter( hHandle );
    return -1; // Error
  }

  // Allocate memory
  pPrnInfo2 = (PRINTER_INFO_2*)malloc( dwSize );

  // Receive printer details
  if(!GetPrinter( hHandle, 2, (LPBYTE)pPrnInfo2, dwSize, &dwSize ))
  {
    ClosePrinter( hHandle );
    free( pPrnInfo2 );
    return -1; // Error
  }

  dwStatus = pPrnInfo2->Status;

  // Free allocated memory
  free( pPrnInfo2 );

  // Close printer
  ClosePrinter( hHandle );

  return dwStatus;
}

所以当我运行它用于这台打印机时,即offline:

像这样:

int status = GetPrinterStatus("POS58");

我收到的状态是0,这和我为功能打印机调用它时完全一样

然后我尝试用 OpenPrinter2W 替换 OpenPrinter 调用并使用 PRINTER_OPTION_NO_CACHE 选项,但它没有帮助。

我做错了什么?

这个离线状态(是的,不止一个)实际上并没有作为状态位存储,而是作为 pPrnInfo2->Attributes 中的 PRINTER_ATTRIBUTE_WORK_OFFLINE 位存储。参见 this KB article

它由 USB 打印机的 USB 端口监视器 (USBMON) 设置,但也可以由用户在 "See what's printing" window 中通过 "Use Printer Offline" 打开或关闭菜单选项:

仅供参考,这是此属性在 Windows 10 的各个位置显示的状态字符串:

  • 在打印管理中(还有您的打印 window)- "Offline"
  • 设备和打印机详细信息视图,状态为 -“”(空字符串)
  • "See what's printing" window 来自设备和打印机 - "Use Printer Offline"

其他离线状态标志位置是:

  • PRINTER_STATUS_OFFLINE - 您对打印机信息状态的期望
  • JOB_STATUS_OFFLINE - 处于作业状态(通常是当前正在打印的作业)

请注意,每台打印机的确切状态行为取决于驱动程序,因为驱动程序可以设置它喜欢的任何状态。例如,我不记得看到网络打印机使用 PRINTER_ATTRIBUTE_WORK_OFFLINE,但我最近看到爱普生收据打印机使用 PRINTER_STATUS_NOT_AVAILABLE。