AccueilCodes sourcesFreewaresArticlesRéponsesRechercheVotre avisNewsMon blogLiensContact
Jeudi 06 Août 2026

Valid HTML 4.01 Transitional

126 codes sources48 articles77 news24 Liens15 avis9 réponses.
Comment connaitre le statut d'une imprimante ?

Ce code a été fournit sur le forum pcsoft par Philippe PASQUALI.

// ************************************
// ON REVIENT AVEC CETTE STRUCTURE
// ************************************
_PRINTER_INFO_2 est une structure
        pServerName est un entier
        pPrinterName est un entier
        pShareName est un entier
        pPortName est un entier
        pDriverName est un entier
        pComment est un entier
        pLocation est un entier
        pDevMode est un entier
        pSepFile est un entier
        pPrintProcessor est un entier
        pDatatype est un entier
        pParameters est un entier
        pSecurityDescriptor est un entier
        Attributes est un entier
        Priority est un entier
        DefaultPriority est un entier
        StartTime est un entier
        UntilTime est un entier
        Status est un entier
        cJobs est un entier
        AveragePPM est un entier
END

// *****************************************************************
// LA FONCTION TRES DETAILLEE POUR FACILITER LA COMPREHENSION
// *****************************************************************
FUNCTION iPrinterGetStatus(pPrinterName=iInfoImprimante())

// Renvoie les informations sur une imprimante
// voir à la fin les informations renvoyées


hdPrint, Ret, cbBuf, pcbNeeded sont des entiers
sPrinterName est une chaîne ASCIIZ sur 512 = pPrinterName
basePRINTER est un _PRINTER_INFO_2
tPRINTER est un tableau dynamique de 1 _PRINTER_INFO_2
PRINTER_INFO_LEVEL est un entier = 2

// Ouverture du handle avec l'imprimante
Ret = API( winspool_drv, "OpenPrinterA" , &sPrinterName, &hdPrint, Null)
IF Ret = 0 THEN RENVOYER ""

// Execution de la fonction une fois avec 0 pour connaitre le nombre exact
cbBuf = 0
pcbNeeded = 0
API( winspool_drv, "GetPrinterA", hdPrint, PRINTER_INFO_LEVEL, &tPRINTER,
cbBuf, &pcbNeeded)
IF pcbNeeded > 0 THEN
        cbBuf = pcbNeeded

                // On redimensionne tPrinter de facon a avoir assez de place.............

                // C'est un peut confu, mais il semble que GetPrinterA stocke dans le
        premier tPRINTER[1] les adresses des chaînes qui sont stockées aprés mais
        DANS la même zone mémoire

                // pcbNeeded     : Nombre d'octet pour la structure et les data
        // dimension(basePRINTER) : Nombre d'octet pour 1 structure
        // donc pour etre sur on prend
        PartieEntière(pcbNeeded/Dimension(basePRINTER))+1

                Dimension(tPRINTER, PartieEntière(pcbNeeded/Dimension(basePRINTER))+1)
        // et on relance
        Ret = API( winspool_drv, "GetPrinterA", hdPrint, PRINTER_INFO_LEVEL,
        &tPRINTER, cbBuf, &pcbNeeded)
        IF Ret = 0 THEN
                API(winspool_drv,"ClosePrinter", hdPrint)
                RENVOYER ""
        END
END

API(winspool_drv,"ClosePrinter", hdPrint)

// Ici on peut exploiter
ServeurName est une chaîne = ChaîneRécupère( tPRINTER[1]:pServerName,
crAdresseASCIIZ)
PrinterName est une chaîne = ChaîneRécupère( tPRINTER[1]:pPrinterName,
crAdresseASCIIZ)
ShareName est une chaîne = ChaîneRécupère( tPRINTER[1]:pShareName,
crAdresseASCIIZ)
PortName est une chaîne = ChaîneRécupère( tPRINTER[1]:pPortName,
crAdresseASCIIZ)
DriverName est une chaîne = ChaîneRécupère( tPRINTER[1]:pDriverName,
crAdresseASCIIZ)
Comment est une chaîne = ChaîneRécupère( tPRINTER[1]:pComment,
crAdresseASCIIZ)
Location est une chaîne = ChaîneRécupère( tPRINTER[1]:pLocation,
crAdresseASCIIZ)
DevMode est une chaîne = ChaîneRécupère( tPRINTER[1]:pDevMode,
crAdresseASCIIZ)
SepFile est une chaîne = ChaîneRécupère( tPRINTER[1]:pSepFile,
crAdresseASCIIZ)
PrintProcessor est une chaîne = ChaîneRécupère( tPRINTER[1]:pPrintProcessor,
crAdresseASCIIZ)
sDatatype est une chaîne = ChaîneRécupère( tPRINTER[1]:pDatatype,
crAdresseASCIIZ)
Parametres est une chaîne
Attribut est un entier = tPRINTER[1]:Attributes
Priority est un entier = tPRINTER[1]:Priority
DefaultPriority est un entier = tPRINTER[1]:DefaultPriority
StartTime est un entier = tPRINTER[1]:StartTime
UntilTime est un entier = tPRINTER[1]:UntilTime
Status est un entier= tPRINTER[1]:Status
cJobs est un entier = tPRINTER[1]:cJobs
AveragePPM est un entier = tPRINTER[1]:AveragePPM

//* Concatenation 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 status faire Val(ExtraitChaine(....,18))
RENVOYER Resultat

// *****************************************************************
// DANS LE CODE D'UN BOUTON
// *****************************************************************
InfoPrinter est une chaîne = iPrinterGetStatus()
IF InfoPrinter <> "" THEN
        Status est un entier = Val(ExtraitChaîne(InfoPrinter,18))
END

// *****************************************************************
// RESULTAT DES TEST
// *****************************************************************
- Imprimante réseaux prête mais dont le toner est bas             0x20000
(PRINTER_STATUS_TONER_LOW)     --> OK
- Imprimante LOCALE absente mais dont le spool est en pause    0x1
(PRINTER_STATUS_PAUSED)             --> OK
- Imprimante réseaux en bourage papier                                 0x8
(PRINTER_STATUS_PAPER_JAM)        --> OK


Liste des codes sources
®2006 - codel5g.com