Mon objective est de déterminer l’état actuel d’une imprimante. J’ai trouvé le code suivant . Voici une version légèrement modifiée pour corriger les memory leaks et les bugs:
#include 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; }
Donc, quand je l’exécute pour cette imprimante, celle-ci est offline
:
Comme ça:
int status = GetPrinterStatus("POS58");
Le statut que je reçois est 0
, ce qui est exactement le même que lorsque je l’appelle pour une imprimante fonctionnelle
J’ai ensuite essayé de remplacer l’appel OpenPrinter
par OpenPrinter2W
et d’utiliser l’option OpenPrinter2W
, mais cela n’a pas aidé.
Qu’est-ce que je fais mal?
Cet état hors ligne (oui, il y en a plus d’un) n’est pas réellement stocké en tant que bit d’état mais comme bit PRINTER_ATTRIBUTE_WORK_OFFLINE dans pPrnInfo2-> Atsortingbutes. Voir cet article de la base de connaissances .
Il est défini par le moniteur de port USB (USBMON) pour une imprimante USB, mais peut également être activé ou désactivé par un utilisateur dans la fenêtre “Voir ce que l’impression est” via l’option de menu “Utiliser l’imprimante hors ligne”:
FYI, voici la chaîne de statut que cet atsortingbut montre à divers endroits dans Windows 10:
Les autres emplacements des indicateurs d’état hors ligne sont les suivants:
Notez que le comportement exact de chaque imprimante dépend du pilote car le pilote peut définir le statut souhaité. Par exemple, je ne me souviens pas avoir vu une imprimante réseau utiliser PRINTER_ATTRIBUTE_WORK_OFFLINE, mais j’ai récemment vu une imprimante de reçus Epson utiliser PRINTER_STATUS_NOT_AVAILABLE.