thierrydelepine
Messages postés
521
Date d'inscription
mardi 24 décembre 2002
Statut
Membre
Dernière intervention
11 septembre 2008
6
26 janv. 2004 à 15:54
Sur le site de VBFRANCE il y a un exemple qui correspond a tes besoins tu aurais du mieux chercher.
le titre : CHANGER LES PROPRIÉTÉS DE L'IMPRIMANTE EN COURS
voici le listing du code de cette exemple que j'ai repris, il faudra donc remercier l'auteur :
je l'ai testé (voir a la fin du code, je demande de changer du bac 3 vers le bac1 et de changer l'orinetation du papier en paysage au lieu de portrait.
ca marche, je suis donc OK pour la bouteille de champagne.
-creer un formulaire vide et y ajouter un bouton command1
et editer le code du formulaire vierge et coller ceci:
Private Const HWND_BROADCAST = &HFFFF
Private Const WM_WININICHANGE = &H1A
Private Const CCHDEVICENAME = 32
Private Const CCHFORMNAME = 32
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const PRINTER_ACCESS_ADMINISTER = &H4
Private Const PRINTER_ACCESS_USE = &H8
Private Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)
Private Const PRINTER_ATTRIBUTE_DEFAULT = 4
Private Const DM_MODIFY = 8
Private Const DM_IN_BUFFER = DM_MODIFY
Private Const DM_COPY = 2
Private Const DM_OUT_BUFFER = DM_COPY
Private Const DMDUP_SIMPLEX = 1
Private Const DMDUP_VERTICAL = 2
Private Const DMDUP_HORIZONTAL = 3
Private Const DM_DUPLEX = &H1000&
Private Const DM_DEFAULTSOURCE = &H200
Private Const DM_ORIENTATION = &H1&
Private Const DM_PAPERLENGTH = &H4&
Private Const DM_PAPERSIZE = &H2&
Private Const DM_PAPERWIDTH = &H8&
Private Const DM_YRESOLUTION = &H2000&
Private Const DMORIENT_PORTRAIT = &H1&
Private Const DMORIENT_LANDSCAPE = &H2&
Private Const DMPAPER_A4 = 9 ' A4 210 x 297 mm
Private Const DMPAPER_A5 = 11 ' A5 148 x 210 mm
Private Const DMPAPER_ENV_C5 = 28 ' Envelope C5 162 x 229 mm
Private Const DMPAPER_ENV_DL = 27 ' Envelope DL 110 x 220mm
Private Type PRINTER_DEFAULTS
pDatatype As Long
pDevMode As Long
DesiredAccess As Long
End Type
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
dmLogPixels As Integer
dmBitsPerPel As Long
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
dmICMMethod As Long ' // Windows 9x seulement
dmICMIntent As Long ' // Windows 9x seulement
dmMediaType As Long ' // Windows 9x seulement
dmDitherType As Long ' // Windows 9x seulement
dmReserved1 As Long ' // Windows 9x seulement
dmReserved2 As Long ' // Windows 9x only
End Type
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Private Declare Function GetLastError Lib "kernel32" () As Long
Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long
Private Declare Function SetPrinter Lib "winspool.drv" Alias "SetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal Command As Long) As Long
Private Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As Long, pcbNeeded As Long) As Long
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
Private Declare Function AbortDoc Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function DocumentProperties Lib "winspool.drv" Alias "DocumentPropertiesA" (ByVal hwnd As Long, ByVal hPrinter As Long, ByVal pDeviceName As String, pDevModeOutput As Any, pDevModeInput As Any, ByVal fMode As Long) As Long
Public Function ChangePrinterSettings(ByRef pOldPaperSize As Long, ByRef pOldBin As Long, Optional ByVal pNewPaperSize, Optional ByVal pNewOrientation As Integer, Optional ByVal pNewBin As Integer) As Boolean
'****************************************************************
'* Gestion des imprimantes *
'*---------------------------------------------------------------------------- *
'* Modification : *
'* - du format du papier *
'* et/ou - de l'orientation *
'* et/ou - du bac d'entrée *
'****************************************************************
Dim hPrinter As Long 'Handle de printer
Dim pd As PRINTER_DEFAULTS
Dim ret As Long, i As Long
Dim TabInfos() As Long
Dim TabInfosSizeNeed As Long ' Taille du tableau nécessaire
Dim NewDevMode As DEVMODE
Dim pFullDevMode As Long
Dim LastError As Long
Dim rep As Long
On Error GoTo ChangePrinterSettingsError
'Affecte les membres de PRINTER_DEFAULTS
With pd
.pDatatype = 0&
.pDevMode = 0&
.DesiredAccess = PRINTER_ALL_ACCESS
End With
'Fournit un hPrinter à Printer.DeviceName
ret = OpenPrinter(Printer.DeviceName, hPrinter, pd)
'Echec de l'ouverture de l'imprimante
If ret = False Then
'pb de droits sur l'imprimante : on rééssaye avec des droits de simple utilisateur (Win NT/2000/XP seulement)
pd.DesiredAccess = (STANDARD_RIGHTS_REQUIRED Or PRINTER_ACCESS_USE)
ret = OpenPrinter(Printer.DeviceName, hPrinter, pd)
If ret = False Then
Select Case GetLastError()
Case 0 To 6
Case 1722
MsgBox "Votre imprimante par défaut est hors connexion. Si c'est une imprimante réseau, vérifier que le poste qui y est rattaché est bien allumé", vbExclamation
Exit Function
Case Else
MsgBox "Erreur de l'API OpenPrinter Code: " & GetLastError()
Exit Function
End Select
End If
End If
ret = GetPrinter(hPrinter, 2, ByVal 0&, 0, TabInfosSizeNeed)
' Pas de vérification de GetLastError ici (normalement -> échec avec une erreur 122 - ERROR_INSUFFICIENT_BUFFER)
' Redimensionnement de TabInfos selon les besoins
ReDim TabInfos((TabInfosSizeNeed \ 4))
' ... appel à GetPrinter() pour la récupération des infos
ret = GetPrinter(hPrinter, 2, TabInfos(0), TabInfosSizeNeed, TabInfosSizeNeed)
'Erreur de GetPrinter : erreurs 0, 6, 1722 ignorées (6 résultant d'un pb de droits utilisateur, 1722, d'une imprimante hors connexion)
If ret = False Then
Select Case GetLastError()
Case 0 To 6
Case 1722
MsgBox "Votre imprimante par défaut est hors connexion. Si c'est une imprimante réseau, vérifier que le poste qui y est rattaché est bien allumé", vbExclamation
Exit Function
Case Else
MsgBox "Erreur de l'API GetPrinter Code: " & GetLastError()
Exit Function
End Select
End If
'Extrait de la structure PRINTER_INFO2 la portion DEVMODE
pFullDevMode = TabInfos(7)
'Copie la portion pointée dans la sous-structure créée à cet effet
Call CopyMemory(NewDevMode, ByVal pFullDevMode, Len(NewDevMode))
'Changement du format du papier et/ou de l'orientation et/ou du bac
With NewDevMode
.dmFields = DM_ORIENTATION Or DM_DEFAULTSOURCE Or DM_PAPERSIZE
'Format papier
If Not IsMissing(pNewPaperSize) Then
If pNewPaperSize > 0 Then
pOldPaperSize = .dmPaperSize
.dmPaperSize = pNewPaperSize
End If
End If
'Orientation
If Not IsMissing(pNewOrientation) Then If pNewOrientation > 0 And pNewOrientation < 3 Then .dmOrientation = pNewOrientation
'Bac
If Not IsMissing(pNewBin) Then
If pNewBin > 0 And pNewBin < 5 Then
pOldBin = .dmDefaultSource
.dmDefaultSource = pNewBin
End If
End If
End With
'Mise à jour du pointeur
Call CopyMemory(ByVal pFullDevMode, NewDevMode, Len(NewDevMode))
'Mise à jour des infos dans la structure propre à l'imprimante
ret = DocumentProperties(0&, hPrinter, Printer.DeviceName, ByVal pFullDevMode, ByVal pFullDevMode, DM_IN_BUFFER Or DM_OUT_BUFFER)
'Mise à jour des propriétés (Windows) de l'imprimante
ret = SetPrinter(hPrinter, 2, TabInfos(0), 0&)
'Erreur de SetPrinter : erreurs 0, 6, 1722 ignorées (6 résultant d'un pb de droits utilisateur, 1722, d'une imprimante hors connexion)
If ret = False Then
Select Case GetLastError()
Case 0 To 6
Case 1722
MsgBox "Votre imprimante par défaut est hors connexion. Si c'est une imprimante réseau, vérifier que le poste qui y est rattaché est bien allumé", vbExclamation
Exit Function
Case Else
MsgBox "Erreur de l'API GetPrinter Code: " & GetLastError()
Exit Function
End Select
End If
'Fermeture du handle del'imprimante
ClosePrinter (hPrinter)
ChangePrinterSettings = True
Exit Function
ChangePrinterSettingsError:
Select Case Err.Number
Case 9, 484
'Err 9 : Débordement de tableau causé par un gestionnaire d'imprimante absent ou non accessible
'Err 484 : Pb d'accès au gestionnaire d'imprimante
Exit Function
Case Else
rep = MsgBox("Erreur : " & Err.Number & "(" & Err.Description & ")" & vbCrLf & "Continuez l'exécution de cette procédure ?", vbQuestion + vbYesNo, "APIs.BAS[ChangePrinterSettings]")
If rep = vbYes Then Resume Next Else Exit Function
End Select
End Function
Private Sub Command1_Click()
n = ChangePrinterSettings(DMPAPER_A4, 3, , DMORIENT_LANDSCAPE, 1)
MsgBox n
End Sub