我正在使用打印机后台打印 API PRINTER_INFO_6
使用GetPrinter()
函数检索打印机状态信息。
我的目标是确定纸张状态(PRINTER_STATUS_PAPER_JAM
、PRINTER_STATUS_PAPER_OUT
、PRINTER_STATUS_PAPER_PROBLEM
(和碳粉状态(PRINTER_STATUS_TONER_LOW
、PRINTER_STATUS_NO_TONER
(。
奇怪的是,无论打印机状态如何,dwStatus
成员始终为零。
以下代码从默认打印机检索打印机状态信息,并将其显示在屏幕上:
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
int main( void )
{
HANDLE hPrinter = INVALID_HANDLE_VALUE;
PPRINTER_INFO_6 pInfo = NULL;
DWORD dwNeeded = 0L;
CHAR szPrinterName[ MAX_PATH + 1 ] = {0};
DWORD dwLength = MAX_PATH;
BOOL ret = FALSE;
ret = GetDefaultPrinter( szPrinterName, &dwLength );
if( ret == FALSE )
{
fprintf(stderr, "[FATAL] GetDefaultPrinter() failed: %lun", GetLastError() );
return EXIT_FAILURE;
}
ret = OpenPrinter( szPrinterName, &hPrinter, NULL );
if( ret == FALSE )
{
fprintf(stderr, "[FATAL] OpenPrinter( '%s' ) failed: %lun", szPrinterName, GetLastError() );
return EXIT_FAILURE;
}
GetPrinter( hPrinter, 6, NULL, 0, &dwNeeded );
if(!dwNeeded)
{
fprintf(stderr, "[FATAL] GetPrinter() failed: %lun", GetLastError() );
ClosePrinter( hPrinter );
return EXIT_FAILURE;
}
pInfo = (PRINTER_INFO_6*) HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, dwNeeded );
if( pInfo == NULL )
{
fprintf(stderr, "[FATAL] HeapAlloc() failed: %lun", GetLastError() );
ClosePrinter( hPrinter );
return EXIT_FAILURE;
}
ret = GetPrinter( hPrinter, 6, (LPBYTE) pInfo, dwNeeded, &dwNeeded );
if( ret == FALSE )
{
fprintf(stderr, "[FATAL] GetPrinter() failed: %lun", GetLastError() );
HeapFree( GetProcessHeap(), 0, pInfo );
ClosePrinter( hPrinter );
return EXIT_FAILURE;
}
fprintf( stdout, "pInfo->dwStatus: 0x%08lXn", pInfo->dwStatus );
HeapFree( GetProcessHeap(), 0, pInfo );
ClosePrinter( hPrinter );
return EXIT_SUCCESS;
}
在上面的代码中,pInfo->dwStatus
始终0x00000000
。
有人可以告诉我出了什么问题吗?蛛丝马迹?
我的目标是确定纸张状态(
PRINTER_STATUS_PAPER_JAM
,PRINTER_STATUS_PAPER_OUT
、PRINTER_STATUS_PAPER_PROBLEM
(和碳粉 状态 (PRINTER_STATUS_TONER_LOW
,PRINTER_STATUS_NO_TONER
(。
仅当打印机出现上述问题时,打印状态才会更改为上述值。 Status = 0
表示打印机当前处于空闲/就绪状态。如果您使用关键字"打印机状态代码",您将看到状态代码= 0表示打印机就绪。似乎它尚未被记录或定义为宏。
纸张和碳粉问题状态类似于"运行时状态",如果不开始打印,则不会设置此类问题状态代码。例如您必须在 api 之后调用GetLastError()
,但不能在之前调用。