IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Orientation avec Winspool


Sujet :

Windows

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Orientation avec Winspool
    L'entreprise dans laquelle je travail à créé une application en Toolbook (pour ceux qui connaissent). Ce langage ne permet pas de modifier le paramétrage des imprimantes lors des impressions (si ce n'est modifié l'imprimante par défaut). J'ai donc voulu créer une DLL en c++ que j'ai linké au programme Toolbook. J'ai déja réussi à créer une DLL permettant de modifier les paramètres de l'imprimante par défaut à l'aide de la librairie Winspool. Jusque la aucun problème mais le fonctionnement n'est pas optimum en effet mon programme étant multi-utilisateurs cela peut provoquer des conflits lors d'impressions simultanée (modifications définitives de la configuration de l'imprimante par défaut). J'ai donc essayé de refaire une DLL qui modifierais les paramètres de l'imprimante mais uniquement pour l'application courante (pas de modifications sur la configuration par défaut). Je m'intéresse pour l'instant uniquement à l'orientation. Mon code semble fonctionner correctement (les objets sont bien modifiés au sain du code) mais aucun changement au niveau de mon application. J'ai le même problème avec n'importe quelle application Windows.
    Des idées ?
    Je joint mon code ci-dessous et vous remercie d'avance de l'aide que vous pourrez m'apporter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
        DWORD pcchBuffer,dwNeeded,dwRet;
        HANDLE hPrinter;
        HWND hwnd;
        
        /*
        * Etape 1 :
        * Identification de la fenêtre Windows
        */ 
        hwnd = GetActiveWindow();
        /*
        * Etape 2 :
        * Récupération de l'imprimante par défaut
        */ 
        GetDefaultPrinter(NULL,&pcchBuffer);
        TCHAR* PrinterName = new TCHAR[pcchBuffer];
        GetDefaultPrinter(PrinterName,&pcchBuffer);
        /*
        * Etape 3 :
        * On ouvre l'imprimante
        */ 
        if (!OpenPrinter(PrinterName, &hPrinter, NULL))
          return;
        /*
        * Etape 4 :
        * Allocation de la taille du buffer
        */ 
        dwNeeded = DocumentProperties(0,hPrinter,PrinterName,NULL,NULL,0);
        DEVMODE* pDevMode = (LPDEVMODE)malloc(dwNeeded);
        /*
        * Etape 5 :
        * Récupération du DevMode
        */ 
        dwRet = DocumentProperties(hwnd,hPrinter,PrinterName,pDevMode,NULL,DM_OUT_BUFFER);
        if (dwRet != IDOK)
        {
           free(pDevMode);
           ClosePrinter(hPrinter);
           return;
        }
        /*
        * Etape 5 :
        * Modification de l'orientation
        */ 
        if (pDevMode->dmFields & DM_ORIENTATION)
            pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
        /*
        * Etape 6 :
        * Enregistrement des modifications dans le DevMode
        */ 
        dwRet = DocumentProperties(hwnd,hPrinter,PrinterName,pDevMode,pDevMode,DM_IN_BUFFER | DM_OUT_BUFFER);
        /*
        * Etape 7 :
        * Fermeture de l'imprimante et désalocation  des variables
        */ 
        ClosePrinter(hPrinter);
        if (dwRet != IDOK)
        {
           free(pDevMode);
           return;
        }
        return;

  2. #2
    Membre habitué Avatar de r2d2abc
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 212
    Points : 179
    Points
    179
    Par défaut
    ma démarche est presque la même mais ..

    je fais un :
    openprinter
    getprinter pour obtenir la taille
    une alloc
    getprinter pour les données
    modification
    setprinter
    un release
    close printer


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
      //change resolution characteristics of printer
      HANDLE hprn;
      if (OpenPrinter (pn,&hprn,null))
        {
         int level=2;
         PRINTER_INFO_2 *pi;
         dword need=0,size=0;
         LPDEVMODE pdm;
         
         cout<<endl<<"open printer ok";
         if (!GetPrinter (hprn, level, 0, 0, &need))
           { cout<<endl<<" need="<<need;
             size=need;
             pi = (PRINTER_INFO_2 *) LocalAlloc (LPTR, need);
       
            if (!GetPrinter (hprn, level, (BYTE *) pi, size, &need)) //del printer or mark it for deletion after jobs are deleted
              {
                cout<<endl<<"get printer fails -> "<<ErrorMsg();
              }
            else
              {
               cout<<endl<<"pi: port="<<pi->pPortName<<" status="<<pi->Attributes<<" jobs="<<pi->cJobs;
               pdm=pi->pDevMode;
               cout<<endl<<"pi: dmPrintQuality="<<pdm->dmPrintQuality;//dmPrintQuality =300
               
               //if (pdm->dmPrintQuality!=200)
                 {
                   pdm->dmPrintQuality=200;
                   pdm->dmFields=DM_PRINTQUALITY;
                   int res = DocumentProperties(0,hprn,pn,pdm,pdm,DM_IN_BUFFER|DM_OUT_BUFFER);
                   cout<<endl<<"dp: after merging res="<<res<<" (idok="<<IDOK<<")";
                   bool ok=SetPrinter (hprn,level,(BYTE *)pi,0);
                   cout<<endl<<"set printer: res="<<ok<<(ok?"":" err=")<<(ok?"":ErrorMsg());
                 }
              }
             LocalFree(pi);
           }
         
         ClosePrinter (hprn);
        }
        else cout<<endl<<"open printer fails -> "<<ErrorMsg();
    hope this helps...

Discussions similaires

  1. [Débutant] Problème pour cliquer sur un rectangle orienté avec matrix
    Par dordel dans le forum C#
    Réponses: 5
    Dernier message: 28/03/2015, 11h38
  2. probleme d'orientation avec forms
    Par yous18 dans le forum Forms
    Réponses: 6
    Dernier message: 18/01/2011, 04h21
  3. Orientation avec les quaternions
    Par Whyzix dans le forum Physique
    Réponses: 1
    Dernier message: 31/12/2009, 15h37
  4. Probleme d'orientation avec un switch
    Par kev484 dans le forum Langage
    Réponses: 20
    Dernier message: 24/06/2009, 12h06
  5. Réponses: 0
    Dernier message: 30/12/2008, 15h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo