PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Etat de l'imprimante solution qui fonctionne
Etat de l'imprimante solution qui fonctionne
Débuté par akaiispam, 22 oct. 2013 04:20 - 6 réponses
Posté le 22 octobre 2013 - 04:20
Hello tout le monde,

Voilà mon problème, je cherche depuis un moment à récupérer l'état de l'imprimante USB et tous les exemples de codes que je trouve sur ce forum ne satisfont pas les exigences de l'application que je veux écrire ou ne fonctionnent pas.

J'aimerai mettre deux imprimantes à la suite qui imprime en tandem, mais pour cela je dois vérifier en continu que l'une et l'autre imprimante imprime bien.

J'ai donc testé certains codes dont celui décrit dans le lien ci-dessous, mais le status que je reçois n'est pas cohérent avec l'état concret de l'imprimante. De plus je ne comprends pas pourquoi le retour de la fonction se fait dans un tableau dynamique...
http://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/search/page/1.awp…

Bref j'aurai bien besoin d'un coup de main
Membre enregistré
948 messages
Posté le 22 octobre 2013 - 10:56
bonjour
Télécharger le source complet que j'avais déposé ici http://depot.pcsoft.fr/resource.awp…
bon dev
Posté le 24 octobre 2013 - 02:28
Bonjour Philippe et merci pour ton code

J'aimerai toutefois te poser une question sur celui-ci. Est-ce normal que l'on ne récupère pas le code d'erreur (exemple bourrage papier) de l'imprimante et si oui, peut-on selon toi le récupérer?

Mon imprimante est une Samsung branchée en USB.

Merci d'avance de ton aide
Posté le 24 octobre 2013 - 05:53
Hello Philippe et merci pour ton code

J'ai tout de même besoin de te demander si c'est normal de ne pas avoir de statut d'imprimante pour le bourrage papier (ou capot ouvert ou autre), mais juste l'info 0 ou 1 si ça imprime? si oui as-tu trouver le moyen de récupérer cette erreur?

Pour info je teste ça sur une imprimante Samsung USB, directement connectée à l'ordi sur lequel je teste ton code.

Cordialement
Membre enregistré
948 messages
Posté le 24 octobre 2013 - 11:20
Bonjour
Quand votre imprimante est en bourrage papier, es-que Windows l’indique dans la gestion des imprimantes ? Si oui , alors il va vous falloir debugger cette vieille collection… Comme elle date déjà de quelques années cela ne lui fera pas de mal d’être rafraîchie à la sauce W18.
Posté le 19 février 2017 - 12:22
Bonjour
toujours en 2017 4 ans apres le poste est status retourne toujours 0 dans tous les cas
une idée svp ??
Membre enregistré
948 messages
Posté le 20 février 2017 - 12:55
Bonjour
je viens de sortir du carton ma vieille imprimante pour tester ce très vieux bout de code et voici les corrections apportées :
FUNCTION iPrinterGetStatus(pPrinterName=iInfoImprimante())
hdPrint, RetAPI, cbBuf, pcbNeeded sont des entiers
sPrinterName est une chaîne ASCIIZ sur 512 = pPrinterName
tPRINTER est un _PRINTER_INFO_2
PRINTER_INFO_LEVEL est un entier = 2
BufferAPI est un Buffer

// Ouverture du handle avec l'imprimante
// see : http://msdn2.microsoft.com/en-us/library/ms536027.aspx
RetAPI = API( winspool_drv, "OpenPrinterA" , &sPrinterName, &hdPrint, Null)
IF RetAPI = 0 THEN RENVOYER ""

// Exécution de la fonction une fois avec 0 pour connaître le nombre exact d'octet
// nécessaires pour stocker le résultat
cbBuf = 0
pcbNeeded = 0
// see : https://msdn.microsoft.com/en-us/library/dd144911.aspx
RetAPI = API( winspool_drv, "GetPrinterA", hdPrint, PRINTER_INFO_LEVEL, &tPRINTER, cbBuf, &pcbNeeded)

//On dimensionne le bufferAPI pour recevoir les pcbNeeded octets
cbBuf = pcbNeeded
BufferAPI = Répète(Caract(0x00), cbBuf)

// et on relance
// see : http://msdn2.microsoft.com/en-us/library/ms535494.aspx
RetAPI = API( winspool_drv, "GetPrinterA" , hdPrint, PRINTER_INFO_LEVEL, &BufferAPI, cbBuf, &pcbNeeded)
IF RetAPI = 0 THEN
API(winspool_drv, "ClosePrinter" , hdPrint)
RENVOYER ""
END

// Fermeture
// see : http://msdn2.microsoft.com/en-us/library/ms535648.aspx
API(winspool_drv,"ClosePrinter", hdPrint)

Transfert(&tPRINTER, &BufferAPI, Dimension(tPRINTER))

// Ici on peut exploiter
ServeurName est une chaîne = ChaîneRécupère( tPRINTER:pServerName, crAdresseASCIIZ)
PrinterName est une chaîne = ChaîneRécupère( tPRINTER:pPrinterName, crAdresseASCIIZ)
ShareName est une chaîne = ChaîneRécupère( tPRINTER:pShareName, crAdresseASCIIZ)
PortName est une chaîne = ChaîneRécupère( tPRINTER:pPortName, crAdresseASCIIZ)
DriverName est une chaîne = ChaîneRécupère( tPRINTER:pDriverName, crAdresseASCIIZ)
Comment est une chaîne = ChaîneRécupère( tPRINTER:pComment, crAdresseASCIIZ)
Location est une chaîne = ChaîneRécupère( tPRINTER:pLocation, crAdresseASCIIZ)
DevMode est une chaîne = ChaîneRécupère( tPRINTER:pDevMode, crAdresseASCIIZ)
SepFile est une chaîne = ChaîneRécupère( tPRINTER:pSepFile, crAdresseASCIIZ)
PrintProcessor est une chaîne = ChaîneRécupère( tPRINTER:pPrintProcessor, crAdresseASCIIZ)
sDatatype est une chaîne = ChaîneRécupère( tPRINTER:pDatatype, crAdresseASCIIZ)
Parametres est une chaîne = ""
Attribut est un entier système = tPRINTER:Attributes
Priority est un entier système = tPRINTER:Priority
DefaultPriority est un entier système = tPRINTER:DefaultPriority
StartTime est un entier système = tPRINTER:StartTime
UntilTime est un entier système = tPRINTER:UntilTime
Status est un entier système = tPRINTER:Status //0=prête, 1=en pause, 16=plus de papier
cJobs est un entier système = tPRINTER:cJobs
AveragePPM est un entier système = tPRINTER:AveragePPM

//* Concaténation des informations
Resultat est une chaîne = ""
Resultat += ServeurName + TAB // 01
Resultat += PrinterName + TAB // 02
Resultat += ShareName + TAB // 03
Resultat += PortName + TAB // 04
Resultat += DriverName + TAB // 05
Resultat += Comment + TAB // 06
Resultat += Location + TAB // 07
Resultat += DevMode + TAB // 08
Resultat += SepFile + TAB // 09
Resultat += PrintProcessor + TAB // 10
Resultat += sDatatype + TAB // 11
Resultat += Parametres + TAB // 12
Resultat += NumériqueVersChaîne(Attribut) + TAB // 13
Resultat += NumériqueVersChaîne(Priority) + TAB // 14
Resultat += NumériqueVersChaîne(DefaultPriority) + TAB // 15
Resultat += NumériqueVersChaîne(StartTime) + TAB // 16
Resultat += NumériqueVersChaîne(UntilTime) + TAB // 17
Resultat += NumériqueVersChaîne(Status) + TAB // 18
Resultat += NumériqueVersChaîne(cJobs) + TAB // 19
Resultat += NumériqueVersChaîne(AveragePPM) + TAB // 20

// Pour avoir le statut faire Val(ExtraitChaine(....,18))
RENVOYER Resultat

testé avec Win7-Windev20-Printer USB
Je pense que le status représente plus le status du spooler que de l'imprimante physique. Si l'imprimante est éteinte, que le spooler soit vide ou pas on obtient 0.

prête avec papier et toner => 0
en pause => 1
plus de papier => 16