IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo
Sommaire > Imprimantes
        Comment parcourir la liste des imprimantes locales disponibles ?
        Comment éditer directement sur une imprimante en mode texte ?
        Comment régler l'imprimante par défaut Windows ?



Comment parcourir la liste des imprimantes locales disponibles ?
Créé le 22/01/2007[haut]
auteur : Farscape
Le principe :
On commence par récupérer le nombre d'imprimante avec EnumPrinters
On alloue un tableau de type PRINTER_INFO_2 pour recevoir les informations et on appelle à nouveau EnumPrinters pour le remplir.
Si on veut récupérer d'autres informations comme le réglage papier par exemple on continuera comme suit :
Ensuite on itère le tableau et pour chaque nom d'imprimante on obtient un handle sur l'imprimante, et enfin un pointeur sur la structure DEVMODE.

Notez que pour la plupart de ces fonctions, un premier appel permet de récupérer la taille de la structure à allouer avant d'effectuer l'appel final?
L'exemple ci-dessus remplit une CCombobox des imprimantes trouvées avec l'indication du format papier (à compléter pour les autres formats).


int GetPrinterList(CComboBox *pCombo)
{
    
    PRINTER_INFO_2*    list;
    DWORD            cnt = 0;
    DWORD            sz = 0;
    int            i;
    int            sl;    
  
    EnumPrinters( PRINTER_ENUM_LOCAL, NULL, 2, NULL, 0, &sz, &cnt );

    if ( (list = (PRINTER_INFO_2*) malloc( sz )) == 0 )    return 0;
    
    if (!EnumPrinters( PRINTER_ENUM_LOCAL, NULL, 2, (LPBYTE)list, sz, &sz, &cnt))
    {
        free( list );
        return 0;
    }
    
    CString str,strSize;    
    HANDLE  hDriver;        
    for ( i = 0, sl = 0; i < (int)cnt; i++ )
    {
        // load printer driver        
        if(!OpenPrinter(list[i].pPrinterName,&hDriver,NULL)) continue;
        if(!hDriver) continue;

        DWORD       dwBufSize = 0;      
        LPDEVMODE   lpDM;
    
        // get DEVMODE stuff from driver
        dwBufSize =DocumentProperties( NULL,
                                  (HANDLE)hDriver,
                                  (LPSTR)list[i].pPrinterName,
                                  (LPDEVMODE)NULL,
                                  (LPDEVMODE)NULL,
                                  (DWORD) 0);
        // alloc space for devmode stuff
        HANDLE    hDevMode= GlobalAlloc(GMEM_MOVEABLE, dwBufSize);
        lpDM = (LPDEVMODE)GlobalLock(hDevMode);
    
        dwBufSize =DocumentProperties(NULL,
                                 (HANDLE)hDriver,
                                 (LPSTR)list[i].pPrinterName,
                                 (LPDEVMODE)lpDM,
                                 (LPDEVMODE)NULL,
                                 (DWORD)DM_COPY);
        strSize="Autre"; // a faire ...
        if(lpDM->dmPaperSize==DMPAPER_A4 ) strSize="A4";

        ClosePrinter(hDriver);

        ::GlobalFree(hDevMode);

        str=list[i].pPrinterName;
        str+=" ";
        str+=strSize;        
        pCombo->AddString(str);
    }
    
    free( list );
    return cnt;
}



Comment éditer directement sur une imprimante en mode texte ?
auteur : Farscape
L'imprimante matricielle étant l'utilisation type:

HANDLE HandlePrinter=NULL;
bool OpenPrinterDirect(char* szPrinterName, char* szDocName)
{
   DOC_INFO_1 di;
   di.pDocName = szDocName; 
   di.pOutputFile = NULL;
   di.pDatatype = "RAW";

   if ( !OpenPrinter(szPrinterName, &HandlePrinter, NULL ) )  return false;
   if ( StartDocPrinter( HandlePrinter, 1, (LPBYTE)&di ) == 0 ) return false;
   if ( !StartPagePrinter( HandlePrinter ) ) return false;

   return true;
}

bool ClosePrinterDirect()
{
    if ( !EndPagePrinter(HandlePrinter ) )return false;
    if ( !EndDocPrinter(HandlePrinter) )return false;
    if ( !ClosePrinter(HandlePrinter) )return false;
    HandlePrinter=NULL;
   return true;
}

BOOL WritePrinterString(const char *sz)
{
   DWORD bw;
   return WritePrinter(HandlePrinter, (void*)sz,strlen(sz),&bw);
}
if(OpenPrinterDirect(?Brother?,?TestsDocument?))
{
   WritePrinterString(?essai d'impressio\n?);
   ClosePrinterDirect();
}

Comment régler l'imprimante par défaut Windows ?
Créé le 07/07/2008[haut]
auteur : Farscape
Il est parfois utile de pouvoir changer l'imprimante par défaut Windows par programme.
Exemple concret : Je veux pouvoir lancer l'impression d'un document Word sur une imprimante pdf par une commande ShellExecute, le problème étant alors de spécifier l'imprimante de traitement à Word.
Depuis Windows 2000 on dispose d'une api Windows spécifique pour ce réglage: SetDefaultPrinter.
Si je reprends mon exemple précédent je procèderais comme suit :

#include <winspool.h>
bool PrintDocument(const TCHAR *szDocument,const TCHAR *szPrinterName)
{
    TCHAR szPrinterOld[256];
   // sauvegarde de l'imprimante par défaut initiale
    DWORD n=sizeof(szPrinterOld)/sizeof(TCHAR);
    ::GetDefaultPrinter(szPrinterOld,&n);

    // fixe la nouvelle imprimante
    if(!::SetDefaultPrinter(szPrinterName)) return false;

   // appel l'application appropriée pour l'impression du document.
    HINSTANCE nerror;    
    if((nerror=::ShellExecute(AfxGetMainWnd()->m_hWnd,_T("print"), szDocument, NULL, NULL,SW_HIDE))<=(HINSTANCE)32)
    {
        CString mess;
        mess.Format(_T("Impossible d'imprimer le Document:\n%s Erreur n°:"),szDocument,nerror);
        AfxMessageBox(mess,MB_ICONEXCLAMATION);
    }
    // restitue l'imprimante par défaut.
    ::SetDefaultPrinter(szPrinterOld);
   // renvoie true si ok
    return (nerror >(HINSTANCE)32);
}
// utilisation:
PrintDocument(_T("C:\\testdoc.docx"),_T("GhostScript Pdf Writer"));
le code ci-dessous imprime le document Word testdoc.docx dans une imprimante pdf



Consultez les autres F.A.Q.


Valid XHTML 1.0 TransitionalValid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2004 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.