Essayer de déterminer l’état de l’imprimante renvoie toujours 0 pour les imprimantes hors ligne et en ligne.

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 :

entrer la description de l'image ici

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”:

entrer la description de l'image ici

FYI, voici la chaîne de statut que cet atsortingbut montre à divers endroits dans Windows 10:

  • Dans la gestion de l’impression (et également dans la fenêtre d’impression) – “Hors ligne”
  • Affichage des détails des périphériques et imprimantes avec le statut – “” (chaîne vide)
  • Fenêtre “Voir ce que l’impression est” à partir des périphériques et imprimantes – “Utiliser l’imprimante hors ligne”

Les autres emplacements des indicateurs d’état hors ligne sont les suivants:

  • PRINTER_STATUS_OFFLINE – Ce que vous attendiez de l’état des informations sur l’imprimante
  • JOB_STATUS_OFFLINE – Dans un statut de travail (généralement le travail d’impression en cours)

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.