ChgDefPrinter




'constant to set printer_info_5 attributes member

Public Const PRINTER_ATTRIBUTE_QUEUED = &H1 '1
Public Const PRINTER_ATTRIBUTE_DIRECT = &H2 '2
Public Const PRINTER_ATTRIBUTE_DEFAULT = &H4 '4
'Public Const PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST = ?

Public Const PRINTER_ATTRIBUTE_SHARED = &H8 '8
Public Const PRINTER_ATTRIBUTE_NETWORK = &H10 '16
Public Const PRINTER_ATTRIBUTE_HIDDEN = &H20 '32
Public Const PRINTER_ATTRIBUTE_LOCAL = &H40 '64
Public Const PRINTER_ATTRIBUTE_WORK_OFFLINE = &H400 '1024
Public Const PRINTER_ATTRIBUTE_ENABLE_BIDI = &H800 '2048
Type PRINTER_INFO_5
pPrinterName As String
pPortName As String
Attributes As Long
DeviceNotSelectedTimeout As Long
TransmissionRetryTimeout As Long
End Type
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
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
Declare Function lstrcpy Lib "Kernel32" Alias "lstrcpyA" _
(ByVal lpString1 As String, ByVal lpString2 As Any) As Long
'***************************************************************************

' NAME: PrinterSetDefault

' NOTES: Make printer the default

' : Taken from Microsoft Knowledge Base article Q167735

' PARAM: hPrinter : handle of printer to set as default

' : bShowError : display an error message if printer is not

available?
' DATE: 9/29/97

'***************************************************************************

Public Function PrinterSetDefault(hPrinter As Long, bShowError As Boolean)
Dim i As Long
Dim BufferSize As Long
Dim Temp() As Long
Dim pInfo5 As PRINTER_INFO_5 'your PRINTER_INFO structure
'make an initial call to GetPrinter, requesting Level 5

'(PRINTER_INFO_5) information, to determine how many bytes needed

i = GetPrinter(hPrinter, 5, ByVal 0&, 0, BufferSize)
'don't want to check GetLastError here - it's supposed to fail

'with a 122 - ERROR_INSUFFICIENT_BUFFER

'redim t as large as you need


ReDim Temp((BufferSize \ 4)) As Long

'and call GetPrinter for keepers this time

i = GetPrinter(hPrinter, 5, Temp(0), BufferSize, BufferSize)
'failed the GetPrinter

If i = False Then
If bShowError Then MsgBox ("Failed to GetPrinter")
Exit Function
End If

'set the members of the pi5 structure for use with SetPrinter

'PtrCtoVbString copies the memory pointed at by the two string

'pointers contained in the Temp() array into a VB string.

'The other three elements are just dWords (long integers) and

'don't require any conversion

pInfo5.pPrinterName = PtrCtoVbString(Temp(0))
pInfo5.pPortName = PtrCtoVbString(Temp(1))
pInfo5.Attributes = Temp(2)
pInfo5.DeviceNotSelectedTimeout = Temp(3)
pInfo5.TransmissionRetryTimeout = Temp(4)

'this is the critical flag that makes it the default printer

pInfo5.Attributes = PRINTER_ATTRIBUTE_DEFAULT '4
' pInfo5.Attributes = PRINTER_ATTRIBUTE_QUEUED '1

' pInfo5.Attributes = PRINTER_ATTRIBUTE_DIRECT '2

' pInfo5.Attributes = PRINTER_ATTRIBUTE_SHARED '8

' pInfo5.Attributes = PRINTER_ATTRIBUTE_NETWORK '10

' pInfo5.Attributes = PRINTER_ATTRIBUTE_HIDDEN '20

' pInfo5.Attributes = PRINTER_ATTRIBUTE_LOCAL '40

' pInfo5.Attributes = PRINTER_ATTRIBUTE_WORK_OFFLINE '400

' pInfo5.Attributes = PRINTER_ATTRIBUTE_ENABLE_BIDI '800


'call SetPrinter to set it

i = SetPrinter(hPrinter, 5, pInfo5, 0)
'failed SetPrinter

If i = False Then
If bShowError Then MsgBox ("SetPrinter Failed. Error code: " &
GetLastError())
Exit Function
End If

PrinterSetDefault = True
End Function

'***************************************************************************

' NAME: PtrCtoVbString

' NOTES: Converts a pointer to a string to a VB string

' : Taken from Microsoft Knowledge Base article Q167735

' : (Be sure this is declared as follows:

' : Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" _

' : (ByVal lpString1 As String, ByVal lpString2 As Any) As Long

' PARAM: Add : pointer-to-string to convert

' DATE: 9/29/97

'***************************************************************************

Private Function PtrCtoVbString(Add As Long) As String
Dim sTemp As String * 512
Dim i As Long
i = lstrcpy(sTemp, Add)
If (InStr(1, sTemp, Chr(0)) = 0) Then
PtrCtoVbString = ""
Else
PtrCtoVbString = Left(sTemp, InStr(1, sTemp, Chr(0)) - 1)
End If

End Function











( chgdefprinter.html )- by Paolo Puglisi - Modifica del 17/12/2023