begin process at 2012 02 13 00:22:49
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Imprimante

 > IMPRIMER SUR L'IMPRIMANTE DE SON CHOIX SANS MODIFIER L'IMPRIMANTE PAR DÉFAUT

IMPRIMER SUR L'IMPRIMANTE DE SON CHOIX SANS MODIFIER L'IMPRIMANTE PAR DÉFAUT


 Information sur la source

Note :
9,5 / 10 - par 4 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Imprimante Niveau :Expert Date de création :19/12/2002 Date de mise à jour :19/12/2002 18:56:50 Vu :19 722

Auteur : dox

Ecrire un message privé
Site perso
Commentaire sur cette source (18)
Ajouter un commentaire et/ou une note

 Description

Le but de ce code est de pouvoir imprimer à partir de VB en utilisant l'objet Printer sans pour autant modifier l'imprimante par défaut définie au niveau de votre PC.
Les tests ont été réalisés sur Windows 2000.
Pour faire fonctionner le programme exemple, vous devez créer un nouveau projet dans lequel vous mettez un RichTextBox et bouton que vous nommez cmdImprimer; ensuite copier le code ci-dessous
N'hésitez pas a m'envoyer vos remarques pertinantes..

Source

  • Option Explicit
  • Private Const CCHDEVICENAME = 32
  • Private Const CCHFORMNAME = 32
  • Private Const PD_RETURNDC = &H100
  • Private Const PD_RETURNIC = &H200
  • Private Const NULL_PTR = 0&
  • Private Type DEVMODE
  • dmDeviceName As String * CCHDEVICENAME
  • dmSpecVersion As Integer
  • dmDriverVersion As Integer
  • dmSize As Integer
  • dmDriverExtra As Integer
  • dmFields As Long
  • dmOrientation As Integer
  • dmPaperSize As Integer
  • dmPaperLength As Integer
  • dmPaperWidth As Integer
  • dmScale As Integer
  • dmCopies As Integer
  • dmDefaultSource As Integer
  • dmPrintQuality As Integer
  • dmColor As Integer
  • dmDuplex As Integer
  • dmYResolution As Integer
  • dmTTOption As Integer
  • dmCollate As Integer
  • dmFormName As String * CCHFORMNAME
  • dmUnusedPadding As Integer
  • dmBitsPerPel As Long
  • dmPelsWidth As Long
  • dmPelsHeight As Long
  • dmDisplayFlags As Long
  • dmDisplayFrequency As Long
  • End Type
  • Private Type DEVNAMES
  • wDriverOffset As Integer
  • wDeviceOffset As Integer
  • wOutputOffset As Integer
  • wDefault As Integer
  • End Type
  • 'renommé pour différencier avec la fonction PrintDlg
  • Private Type InformationImprimante ' PRINTDLG
  • lStructSize As Long
  • hwndOwner As Long
  • hDevMode As Long
  • hDevNames As Long
  • hdc As Long
  • flags As Long
  • nFromPage As Integer
  • nToPage As Integer
  • nMinPage As Integer
  • nMaxPage As Integer
  • nCopies As Integer
  • hInstance As Long
  • lCustData As Long
  • lpfnPrintHook As Long
  • lpfnSetupHook As Long
  • lpPrintTemplateName As String
  • lpSetupTemplateName As String
  • hPrintTemplate As Long
  • hSetupTemplate As Long
  • End Type
  • Private Declare Function PrintDlg Lib "comdlg32.dll" Alias "PrintDlgA" (pPrintdlg As InformationImprimante) As Long
  • Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
  • Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
  • Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
  • Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
  • Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
  • Private Sub cmdImprimer_Click()
  • Dim retourAPI As Long
  • Dim imprimanteSelectionne As InformationImprimante
  • Dim infoDevice As DEVMODE
  • Dim nomImprimante As String
  • Dim adresseStructureDEVMODE As Long
  • Dim imprimante As Printer
  • '
  • On Error GoTo Err_Impression
  • '
  • retourAPI = 0
  • '
  • ' Initialisation de la structure d'échange
  • '
  • imprimanteSelectionne.lStructSize = Len(imprimanteSelectionne)
  • imprimanteSelectionne.hDevMode = NULL_PTR
  • imprimanteSelectionne.hDevNames = NULL_PTR
  • imprimanteSelectionne.flags = PD_RETURNIC
  • ' Ouverture du CommonDialog via l'API PrintDlg
  • retourAPI = PrintDlg(imprimanteSelectionne)
  • ' Retour de l'API si Annulé -> Retour = 0
  • Select Case retourAPI
  • Case 0 'Abandon
  • Exit Sub
  • Case 1 ' OK
  • adresseStructureDEVMODE = GlobalLock(imprimanteSelectionne.hDevMode)
  • Call CopyMemory(infoDevice, ByVal adresseStructureDEVMODE, Len(infoDevice))
  • nomImprimante = Left(infoDevice.dmDeviceName, InStr(1, infoDevice.dmDeviceName, Chr(NULL_PTR)) - 1)
  • For Each imprimante In Printers
  • If nomImprimante = imprimante.DeviceName Then
  • Set Printer = imprimante
  • Exit For
  • End If
  • Next
  • Case Else 'an error occured
  • MsgBox ("Erreur inatendue")
  • Exit Sub
  • End Select
  • '
  • ' Affectation des paramètres de configuration de l'imprimante
  • Printer.Orientation = infoDevice.dmOrientation
  • Printer.Copies = infoDevice.dmCopies
  • ' etc...
  • '
  • ' Ecriture du texte en utilisant l'objet Printer
  • Printer.Print "OK"
  • RichTextBox1.SelPrint Printer.hdc
  • Printer.EndDoc
  • Exit Sub
  • Err_Impression:
  • End Sub
Option Explicit

Private Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32
Private Const PD_RETURNDC = &H100
Private Const PD_RETURNIC = &H200
Private Const NULL_PTR = 0&

Private Type DEVMODE
        dmDeviceName As String * CCHDEVICENAME
        dmSpecVersion As Integer
        dmDriverVersion As Integer
        dmSize As Integer
        dmDriverExtra As Integer
        dmFields As Long
        dmOrientation As Integer
        dmPaperSize As Integer
        dmPaperLength As Integer
        dmPaperWidth As Integer
        dmScale As Integer
        dmCopies As Integer
        dmDefaultSource As Integer
        dmPrintQuality As Integer
        dmColor As Integer
        dmDuplex As Integer
        dmYResolution As Integer
        dmTTOption As Integer
        dmCollate As Integer
        dmFormName As String * CCHFORMNAME
        dmUnusedPadding As Integer
        dmBitsPerPel As Long
        dmPelsWidth As Long
        dmPelsHeight As Long
        dmDisplayFlags As Long
        dmDisplayFrequency As Long
End Type
Private Type DEVNAMES
        wDriverOffset As Integer
        wDeviceOffset As Integer
        wOutputOffset As Integer
        wDefault As Integer
End Type
'renommé pour différencier avec la fonction PrintDlg
Private Type InformationImprimante      ' PRINTDLG
    lStructSize As Long
    hwndOwner As Long
    hDevMode As Long
    hDevNames As Long
    hdc As Long
    flags As Long
    nFromPage As Integer
    nToPage As Integer
    nMinPage As Integer
    nMaxPage As Integer
    nCopies As Integer
    hInstance As Long
    lCustData As Long
    lpfnPrintHook As Long
    lpfnSetupHook As Long
    lpPrintTemplateName As String
    lpSetupTemplateName As String
    hPrintTemplate As Long
    hSetupTemplate As Long
End Type

Private Declare Function PrintDlg Lib "comdlg32.dll" Alias "PrintDlgA" (pPrintdlg As InformationImprimante) As Long

Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)

Private Sub cmdImprimer_Click()
    Dim retourAPI As Long
    Dim imprimanteSelectionne As InformationImprimante
    Dim infoDevice As DEVMODE
    Dim nomImprimante As String
    Dim adresseStructureDEVMODE As Long
    Dim imprimante As Printer
    '
    On Error GoTo Err_Impression
    '
    retourAPI = 0
    '
    ' Initialisation de la structure d'échange
    '
    imprimanteSelectionne.lStructSize = Len(imprimanteSelectionne)
    imprimanteSelectionne.hDevMode = NULL_PTR
    imprimanteSelectionne.hDevNames = NULL_PTR
    imprimanteSelectionne.flags = PD_RETURNIC

    ' Ouverture du CommonDialog via l'API PrintDlg
    retourAPI = PrintDlg(imprimanteSelectionne)
    
    ' Retour de l'API si Annulé -> Retour = 0
    Select Case retourAPI
    
    Case 0 'Abandon
        Exit Sub
    Case 1 ' OK
        adresseStructureDEVMODE = GlobalLock(imprimanteSelectionne.hDevMode)
        Call CopyMemory(infoDevice, ByVal adresseStructureDEVMODE, Len(infoDevice))

        nomImprimante = Left(infoDevice.dmDeviceName, InStr(1, infoDevice.dmDeviceName, Chr(NULL_PTR)) - 1)
        For Each imprimante In Printers
            If nomImprimante = imprimante.DeviceName Then
                Set Printer = imprimante
                Exit For
            End If
        Next
    Case Else 'an error occured
        MsgBox ("Erreur inatendue")
        Exit Sub
    End Select
    '
    ' Affectation des paramètres de configuration de l'imprimante
    Printer.Orientation = infoDevice.dmOrientation
    Printer.Copies = infoDevice.dmCopies
    ' etc...
    '
    ' Ecriture du texte en utilisant l'objet Printer
    Printer.Print "OK"
    RichTextBox1.SelPrint Printer.hdc
    Printer.EndDoc
    
    Exit Sub

Err_Impression:

End Sub



 Sources du même auteur

SYNCHRONISER L'EXÉCUTION D'UNE TÂCHE DOS AVEC UN PROGRAMME V...

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) PARAMETRES_IMPRIMANTE par Le Pivert
Source avec Zip Source .NET (Dotnet) IMPRESSION FACILE EN ÉVITANT LES BUGS DU FRAMEWORK par circular
Source avec Zip Source .NET (Dotnet) CLASSE POUR AJOUTER/CONNECTER/DECONNECTER UNE IMPRIMANTE RÉS... par radcur
Source avec Zip Source avec une capture IMPRESSION AU FIL DE L'EAU VERS IMPRIMANTE MATRICIELLE par rimas10
Source avec Zip Source avec une capture IMPRIMER CODE BARE par StetechCove

Commentaires et avis

Commentaire de LeWolf le 16/07/2003 17:01:50

Tres bien
Ca c'est pil poil ce que je cherchai
Y a plus qu'a mettre le nouveau commondialog et c'est parfait :)

Commentaire de PROGRAMMIX le 21/10/2003 12:30:42

J'aimerais permettre le choix entre "Tout imprimer" et "Imprimer la sélection" (voire "Imprimer page x à Y").  

Comment faire pour récupérer ces options définies par l'utilisateur ?

Commentaire de fvajol le 06/11/2003 10:48:35

J'utilise le code fourni sous windows 98. Il fonctionne très bien jusqu'au moment où je veux fermer l'application. J'ai alors un message me disant 'Erreur Imprimante' apparaît ensuite un deuxième message 'Cette application a créer une erreur ... dans Kernel32.dll'. Le seul moyen qui me reste pour récupérer la mai est de couper mon pc et de le redémarrer...

Si vous avez des réponses, je suis preneur...

Commentaire de PROGRAMMIX le 06/11/2003 16:10:47

>>>fvajol
J'utilise également ce code avec Win98 SE et VB6 SP5 et il ne me pose aucun problème de ce genre...  

As-tu fait du copier-coller ? Les dll sont-elles bien présentes ?
As-tu activé le gestionnaire d'erreur pour tenter de récupérer la main ?

Commentaire de ToshiBaba le 02/02/2004 18:44:59

Salut,
je suis sous w2k, vb6 sp5. J'ai aussi l'erreur 482 "Erreur imprimante" (soit-dit en passant, on est super avancé avec un message aussi explicite) mais à la ligne printer.EndDoc
En traçant, je me suis rendu compte que le nom de mon imprimante réseau prenait plus de 32 caracteres... mais même résolvant ce souci, j'ai toujours cette erreur. Si quelqu'un a une idée, je suis preneur :)

Commentaire de Lindice le 22/05/2005 16:37:46

Merci dox : j'ai pas mal galéré sur un problème d'impression avant de trouver ton code. Ca marche parfaitement...

Commentaire de KeepCool37 le 15/06/2005 14:11:04

Merci pour le code.
Toutefois, ça ne marche pas sur ma machine XP avec une imprimante en partage sur le réseau dont le nom dépasse 32 caractères genre "ilétaitunefoissurleréseau une belle imprimante", bref un nom à la Bill Gates.
J'ai donc remplacé la ligne 108
If nomImprimante = imprimante.DeviceName Then
par
If InStr(1, imprimante.DeviceName, nomImprimante) Then
et ça marche au poil !
Voilà

Commentaire de MGD le 14/07/2005 15:52:33

J'avais écrit à peu près la même chose il y a plusieurs années. Malheureusement, la recopie des propriétés dans l'objet Printer de VB ne suffit pas, car ce dernier ne connait pas tous les détails des imprimantes modernes : par exemple, avec une HP Laserjet 2300dn (ou une autre supportant le recto-verso), essayez d'imprimer en recto-verso, deux pages par feuille en mode livret... aucune de ces options n'est prise en compte.

En fait, il faudrait pouvoir recopier les structures récupérées par PrintDlg dans celles de l'objet Printer de VB (et encore, il faudrait utiliser les nouvelles structures PRINTDLGEX et la fontion PrintDlgEx). Je n'ai pas encore trouvé comment y accéder. Si vous avez une méthode, je suis preneur.

Commentaire de elab le 16/07/2005 23:21:30

bonjour si ca peut vous aider
sur un feuille en vb6 pro mettre un bouton et copier:

Private Sub Command1_Click()
Dim i
Dim bb
For i = 0 To Printers.Count - 1
bb = Printers(i).DeviceName ' imp des N° imprimantes et nom
bbb = bbb & bb
Print bb
Next i
' une stylus c62 en N°5 et une stylus c64 en N°0(imp par defaut)
Set Printer = Printers(5)
Printer.Print bbb
Printer.EndDoc
Set Printer = Printers(0)
Printer.Print bbb
Printer.EndDoc

End Sub

Commentaire de MGD le 17/07/2005 19:01:48

Oui.... Et c'est avec ce code que vous arrivez à imprimer en recto-verso, 2 pages par feuilles en mode livret ??? Bien sûr, sur une imprimante autre que l'imprimante par défaut et avec un réglage par défaut différent... Le recto-verso simple, on y arrive avec la propriété Duplex. Mais pour le reste??

Ce que je recherche, ce n'est pas liste des imprimantes, c'est comment lire et écrire ce type de paramètre dans l'objet Printer de VB.

Au fait, j'ai trouvé chez Microsoft une DLL qui permet d'appeler les mêmes fonctions que la partie Impression de l'ActiveX Common Dialog, mais sans avoir à charger le contrôle. Cela s'appelle VBPrnDlg.dll et se télécharge à partir de :
<<http://search.microsoft.com/search/results.aspx?qu=vbprndlg&View=msdn&st=b&c=0&s=1&swc=0>>
Attention : l'adresse est constituée de TOUT ce qui est entre <<et>> (même si sur votre écran il y en a une partie à la ligne suivant) Si vous ne trouvez pas, allez sur la MSDN et tapez VBPRNDLG dans le moteur de recherche.
Notez que cela ne résoud pas mon problème...

Commentaire de bichoncanada le 20/04/2006 15:43:16

Salut dox,
Vu que tu as réussi a faire ce code pour une imprimante, je me demandais si tu n'en avais pas un concernant le choix de webcam. Je m'explique, pouvoir choisir une webcam parmis d'autres connectés au meme PC sans changer celle par défaut. Vois tu ce que je veux dire ?
Cela fait 1 mois que je galère et personne n'a pu encore m'aidé, mes espoirs reposent sur toi, lol. Non, sérieusement ca m'aiderait bcp et me permettrait d'avancer.

Merci d'avance,

bonne journée

Guillaume

Commentaire de potain_vb le 15/06/2006 19:08:59

BOnjour COmment fait on pour adapter votre code pour qu'au lieu d'imprimer ce qu'il y a dans la richtextbox , on puisse imprimer un fichier comme par exemple un Tif ? car en fait j'ai développer un visualiseur tif autour de l'ocx d'imaging et je voudrais mettre la fonction imprimer.

SI vous savez comment faire merci ca serait sympa .

@+++

Commentaire de dox le 16/06/2006 11:36:07

Réponse à POTAIN_VB
Désolé mais je ne connais pas l'ocx d'imaging, voir si il n'existe pas une méthode print sur ce controle.

Bonne chance

Commentaire de potain_vb le 16/06/2006 13:16:00

j'ai une methode printimage sur le imgedit avec en paramètre il faut passer

imgedit1.printimage [startpage][endpage][outputformat][annotation][printer][Driver][Portnumber]. Comment je peux y adapter par rapport a printer?

Commentaire de vienbv le 21/06/2006 05:13:26

C'est surper. Je te remercie, ce code m'aide à trouver la solution que j'ai du mal à faire.

Commentaire de K_Nicaise82 le 27/06/2006 13:05:14

Je voudrais lancer l'impression d'un état sur un poste client.Mon application est réalisée en vb.net et utilise crystal report.C'est une application webform.

Commentaire de nvb23 le 10/08/2007 10:18:22

salut
j'ai copie ce que t'as ecrit mais ca ne marche pas il me dise que printer et printers ne sont pas declare et j'ai besoin d'aide pour imprimer un fichier word avec choix de l'imprimante parce que j'ai fAIT un programme qui quelquesoit le choix de l'imprimante que j'ai fait (dans printdialog)me renvoie a l'imprimante par default.
remarque: je travaille sur vb 2005

Commentaire de tekanerahtatase le 31/01/2011 14:27:00

J'ai le message d'erreur suivant: User-defined type not defined.
sur la ligne :
Private Declare Function PrintDlg Lib "comdlg32.dll" Alias "PrintDlgA" (pPrintdlg As InformationImprimante) As Long

Quelqu'un peut m'aider... ? merci

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,700 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales