Option Explicit
Private PageDirection As Integer
Private OldPrinterName As String
Private OldPrinterDriverName As String
Private OldPrinterQuality As Long
Private OldPrinterQuantaty As Long
Private OldPrinterOrentation As Long
Private OldPrinterTray As Long
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 DM_MODIFY = 8
Private Const DM_IN_BUFFER = DM_MODIFY
Private Const DM_COPY = 2
Private Const DM_OUT_BUFFER = DM_COPY
Private Const DM_DUPLEX = &H1000&
Public Const DMDUP_SIMPLEX = 1
Private Const DMDUP_VERTICAL = 2
Private Const DMDUP_HORIZONTAL = 3
Private Const DM_ORIENTATION = &H1&
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 95 only
dmICMIntent As Long ' // Windows 95 only
dmMediaType As Long ' // Windows 95 only
dmDitherType As Long ' // Windows 95 only
dmReserved1 As Long ' // Windows 95 only
dmReserved2 As Long ' // Windows 95 only
End Type
Private Type PRINTER_DEFAULTS
pDatatype As String
pDevMode As Long
DesiredAccess As Long
End Type
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 Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter 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, ByVal pDevModeOutput As Any, ByVal pDevModeInput As Any, ByVal fMode As Long) As Long
Public Sub ChngOrientationLandscape()
PageDirection = 2
Call SetOrientation(DMDUP_SIMPLEX, PageDirection)
End Sub
Public Sub ReSetOrientation()
If PageDirection = 1 Then
PageDirection = 2
Else
PageDirection = 1
End If
Call SetOrientation(DMDUP_SIMPLEX, PageDirection)
End Sub
Public Sub ChngOrientationPortrait()
PageDirection = 1
Call SetOrientation(DMDUP_SIMPLEX, 1)
End Sub
Public Sub SetOrient(ByVal Landscape As Boolean)
Select Case Landscape
Case True
ChngOrientationLandscape
Case False
ReSetOrientation
End Select
End Sub
Public Sub SetOrientation(NewSetting As Long, chng As Integer)
On Error GoTo 10
Dim PrinterHandle As Long
Dim PrinterName As String
Dim pd As PRINTER_DEFAULTS
Dim MyDevMode As DEVMODE
Dim Result As Long
Dim Needed As Long
Dim pFullDevMode As Long
Dim pi2_buffer() As Long
PrinterName = Printer.DeviceName
If PrinterName = "" Then
Exit Sub
End If
pd.pDatatype = vbNullString
pd.pDevMode = 0&
pd.DesiredAccess = PRINTER_ALL_ACCESS
Result = OpenPrinter(PrinterName, PrinterHandle, pd)
Result = GetPrinter(PrinterHandle, 2, ByVal 0&, 0, Needed)
ReDim pi2_buffer((Needed \ 4))
Result = GetPrinter(PrinterHandle, 2, pi2_buffer(0), Needed, Needed)
pFullDevMode = pi2_buffer(7)
Call CopyMemory(MyDevMode, ByVal pFullDevMode, Len(MyDevMode))
MyDevMode.dmDuplex = NewSetting
MyDevMode.dmFields = DM_DUPLEX Or DM_ORIENTATION
MyDevMode.dmOrientation = chng
Call CopyMemory(ByVal pFullDevMode, MyDevMode, Len(MyDevMode))
Result = DocumentProperties(Form1.hwnd, PrinterHandle, PrinterName, ByVal pFullDevMode, ByVal pFullDevMode, DM_IN_BUFFER Or DM_OUT_BUFFER)
Result = SetPrinter(PrinterHandle, 2, pi2_buffer(0), 0&)
Call ClosePrinter(PrinterHandle)
Dim p As Printer
For Each p In Printers
If p.DeviceName = PrinterName Then
Set Printer = p
Exit For
End If
Next p
Printer.Duplex = MyDevMode.dmDuplex
Exit Sub
10
MsgBox Err.Number & " " & Err.Description
End Sub
Public Sub SetPrinterJob(PrinterName As String, PrinterQuality As Long, PrinterQuantaty As Long, PrinterOrentation As Long, PrinterTray As Long)
' On Error GoTo 10
Dim PrinterHandle As Long
Dim pd As PRINTER_DEFAULTS
Dim MyDevMode As DEVMODE
Dim Result As Long
Dim Needed As Long
Dim pFullDevMode As Long
Dim pi2_buffer() As Long
Dim i As Long
If PrinterName = "" Then
Exit Sub
End If
OldPrinterName = Printer.DeviceName
pd.pDatatype = vbNullString
pd.pDevMode = 0&
pd.DesiredAccess = PRINTER_ALL_ACCESS
Result = OpenPrinter(PrinterName, PrinterHandle, pd)
Result = GetPrinter(PrinterHandle, 2, ByVal 0&, 0, Needed)
ReDim pi2_buffer((Needed \ 4))
Result = GetPrinter(PrinterHandle, 2, pi2_buffer(0), Needed, Needed)
pFullDevMode = pi2_buffer(7)
Call CopyMemory(MyDevMode, ByVal pFullDevMode, Len(MyDevMode))
'remember old settings to set back later...
OldPrinterTray = Printer.PaperBin
OldPrinterOrentation = Printer.Orientation
OldPrinterQuality = Printer.PrintQuality
OldPrinterQuantaty = Printer.Copies
'here i set the info
MyDevMode.dmDeviceName = Printer.DeviceName
MyDevMode.dmSize = Len(MyDevMode)
MyDevMode.dmFields = DM_DUPLEX Or DM_ORIENTATION
MyDevMode.dmOrientation = PrinterOrentation
MyDevMode.dmDefaultSource = PrinterTray
MyDevMode.dmPrintQuality = PrinterQuality
MyDevMode.dmCopies = CLng(PrinterQuantaty)
MyDevMode.dmDuplex = DMDUP_SIMPLEX
'small sleep timer
For i = 0 To 255
DoEvents
Next i
'here it should be setting the info that i changed above
Call CopyMemory(ByVal pFullDevMode, MyDevMode, Len(MyDevMode))
'not sure what this does, but doesn't work without this.
Result = DocumentProperties(Form1.hwnd, PrinterHandle, PrinterName, ByVal pFullDevMode, ByVal pFullDevMode, DM_IN_BUFFER Or DM_OUT_BUFFER)
Result = SetPrinter(PrinterHandle, 2, pi2_buffer(0), 0&)
Call ClosePrinter(PrinterHandle)
Dim p As Printer
For Each p In Printers
If p.DeviceName = PrinterName Then
Set Printer = p
Exit For
End If
Next p
Printer.Duplex = MyDevMode.dmDuplex
Exit Sub
10
MsgBox Err.Number & " " & Err.Description
End Sub
Public Sub ReSetPrinterJob()
On Error Resume Next
Dim PrinterHandle As Long
Dim pd As PRINTER_DEFAULTS
Dim MyDevMode As DEVMODE
Dim Result As Long
Dim Needed As Long
Dim pFullDevMode As Long
Dim pi2_buffer() As Long
Dim PrinterName As String
PrinterName = OldPrinterName
pd.pDatatype = vbNullString
pd.pDevMode = 0&
pd.DesiredAccess = PRINTER_ALL_ACCESS
Result = OpenPrinter(PrinterName, PrinterHandle, pd)
Result = GetPrinter(PrinterHandle, 2, ByVal 0&, 0, Needed)
ReDim pi2_buffer((Needed \ 4))
Result = GetPrinter(PrinterHandle, 2, pi2_buffer(0), Needed, Needed)
pFullDevMode = pi2_buffer(7)
Call CopyMemory(MyDevMode, ByVal pFullDevMode, Len(MyDevMode))
MyDevMode.dmDuplex = DMDUP_SIMPLEX
MyDevMode.dmFields = DM_DUPLEX Or DM_ORIENTATION
MyDevMode.dmOrientation = OldPrinterOrentation
MyDevMode.dmDefaultSource = OldPrinterTray
MyDevMode.dmPrintQuality = OldPrinterQuality
MyDevMode.dmCopies = OldPrinterQuantaty
Call CopyMemory(ByVal pFullDevMode, MyDevMode, Len(MyDevMode))
Result = DocumentProperties(JobInformation.hwnd, PrinterHandle, PrinterName, ByVal pFullDevMode, ByVal pFullDevMode, DM_IN_BUFFER Or DM_OUT_BUFFER)
Result = SetPrinter(PrinterHandle, 2, pi2_buffer(0), 0&)
Call ClosePrinter(PrinterHandle)
Dim p As Printer
For Each p In Printers
If p.DeviceName = PrinterName Then
Set Printer = p
Exit For
End If
Next p
Printer.Duplex = MyDevMode.dmDuplex
Exit Sub
10
MsgBox Err.Number & " " & Err.Description
End Sub