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é icihttp://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 :
FUNCTIONiPrinterGetStatus(pPrinterName=iInfoImprimante())
hdPrint,RetAPI,cbBuf,pcbNeededsont desentiers
sPrinterNameest une chaîne ASCIIZ sur512=pPrinterName
tPRINTERest un_PRINTER_INFO_2
PRINTER_INFO_LEVELest un entier=2
BufferAPIest unBuffer

// Ouverture du handle avec l'imprimante
// see : http://msdn2.microsoft.com/en-us/library/ms536027.aspx
RetAPI=API(winspool_drv,"OpenPrinterA", &sPrinterName, &hdPrint,Null)
IFRetAPI=0THEN 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)
IFRetAPI=0THEN
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
ServeurNameest une chaîne=ChaîneRécupère(tPRINTER:pServerName,crAdresseASCIIZ)
PrinterNameest une chaîne=ChaîneRécupère(tPRINTER:pPrinterName,crAdresseASCIIZ)
ShareNameest une chaîne=ChaîneRécupère(tPRINTER:pShareName,crAdresseASCIIZ)
PortNameest une chaîne=ChaîneRécupère(tPRINTER:pPortName,crAdresseASCIIZ)
DriverNameest une chaîne=ChaîneRécupère(tPRINTER:pDriverName,crAdresseASCIIZ)
Commentest une chaîne=ChaîneRécupère(tPRINTER:pComment,crAdresseASCIIZ)
Locationest une chaîne=ChaîneRécupère(tPRINTER:pLocation,crAdresseASCIIZ)
DevModeest une chaîne=ChaîneRécupère(tPRINTER:pDevMode,crAdresseASCIIZ)
SepFileest une chaîne=ChaîneRécupère(tPRINTER:pSepFile,crAdresseASCIIZ)
PrintProcessorest une chaîne=ChaîneRécupère(tPRINTER:pPrintProcessor,crAdresseASCIIZ)
sDatatypeest une chaîne=ChaîneRécupère(tPRINTER:pDatatype,crAdresseASCIIZ)
Parametresest une chaîne=""
Attributest un entier système=tPRINTER:Attributes
Priorityest un entier système=tPRINTER:Priority
DefaultPriorityest un entier système=tPRINTER:DefaultPriority
StartTimeest un entier système=tPRINTER:StartTime
UntilTimeest un entier système=tPRINTER:UntilTime
Statusest un entier système=tPRINTER:Status//0=prête, 1=en pause, 16=plus de papier
cJobsest un entier système=tPRINTER:cJobs
AveragePPMest un entier système=tPRINTER:AveragePPM

//* Concaténation des informations
Resultatest 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))
RENVOYERResultat

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