Prev: Find and Replace missing font (font substitution problem)
Next: Combo Boxes not populating correctly
From: Senad Isanovic on 13 Nov 2006 05:08 This code works fine if you have Admin rights, otherwise I cann't acces the current (network) printer. Please any suggestions? Thanks! /Senad "Controlling the Printer from Word VBA Part 2: Using VBA to control Duplex, Color Mode and Print Quality http://pubs.logicalexpressions.com/Pub0009/LPMArticle.asp?ID=116" Option Explicit Private Type PRINTER_DEFAULTS pDatatype As Long pDevmode As Long DesiredAccess As Long End Type Private Type PRINTER_INFO_2 pServerName As Long pPrinterName As Long pShareName As Long pPortName As Long pDriverName As Long pComment As Long pLocation As Long pDevmode As Long ' Pointer to DEVMODE pSepFile As Long pPrintProcessor As Long pDatatype As Long pParameters As Long pSecurityDescriptor As Long ' Pointer to SECURITY_DESCRIPTOR Attributes As Long Priority As Long DefaultPriority As Long StartTime As Long UntilTime As Long Status As Long cJobs As Long AveragePPM As Long End Type Private Type DEVMODE dmDeviceName As String * 32 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 * 32 dmUnusedPadding As Integer dmBitsPerPel As Integer dmPelsWidth As Long dmPelsHeight As Long dmDisplayFlags As Long dmDisplayFrequency As Long dmICMMethod As Long dmICMIntent As Long dmMediaType As Long dmDitherType As Long dmReserved1 As Long dmReserved2 As Long End Type Private Const DM_ORIENTATION = &H1 Private Const DM_PAPERSIZE = &H2 Private Const DM_PAPERLENGTH = &H4 Private Const DM_PAPERWIDTH = &H8 Private Const DM_DEFAULTSOURCE = &H200 Private Const DM_PRINTQUALITY = &H400 Private Const DM_COLOR = &H800 Private Const DM_DUPLEX = &H1000 Private Const DM_IN_BUFFER = 8 Private Const DM_OUT_BUFFER = 2 Private Const PRINTER_ACCESS_USE = &H8 Private Const STANDARD_RIGHTS_REQUIRED = &HF0000 Private Const PRINTER_NORMAL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _ PRINTER_ACCESS_USE) Private Const PRINTER_ENUM_CONNECTIONS = &H4 Private Const PRINTER_ENUM_LOCAL = &H2 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 Long, ByVal pDevModeInput As Long, _ ByVal fMode As Long) As Long Private Declare Function GetPrinter Lib "winspool.drv" Alias _ "GetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, _ pPrinter As Byte, ByVal cbBuf As Long, pcbNeeded As Long) 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 Byte, ByVal Command As Long) As Long Private Declare Function EnumPrinters Lib "winspool.drv" _ Alias "EnumPrintersA" _ (ByVal flags As Long, ByVal name As String, ByVal Level As Long, _ pPrinterEnum As Long, ByVal cdBuf As Long, pcbNeeded As Long, _ pcReturned As Long) As Long Private Declare Function PtrToStr Lib "kernel32" Alias "lstrcpyA" _ (ByVal RetVal As String, ByVal Ptr As Long) As Long Private Declare Function StrLen Lib "kernel32" Alias "lstrlenA" _ (ByVal Ptr As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _ (pDest As Any, pSource As Any, ByVal cbLength As Long) Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Declare Function DeviceCapabilities Lib "winspool.drv" _ Alias "DeviceCapabilitiesA" (ByVal lpDeviceName As String, _ ByVal lpPort As String, ByVal iIndex As Long, lpOutput As Any, _ ByVal dev As Long) As Long Public Sub SetColorMode(iColorMode As Long) SetPrinterProperty DM_COLOR, iColorMode End Sub Public Function GetColorMode() As Long GetColorMode = GetPrinterProperty(DM_COLOR) End Function Public Sub SetDuplex(iDuplex As Long) SetPrinterProperty DM_DUPLEX, iDuplex End Sub Public Function GetDuplex() As Long GetDuplex = GetPrinterProperty(DM_DUPLEX) End Function Public Sub SetPrintQuality(iQuality As Long) SetPrinterProperty DM_PRINTQUALITY, iQuality End Sub Public Function GetPrintQuality() As Long GetPrintQuality = GetPrinterProperty(DM_PRINTQUALITY) End Function Private Function SetPrinterProperty(ByVal iPropertyType As Long, _ ByVal iPropertyValue As Long) As Boolean 'Code adapted from Microsoft KB article Q230743 Dim hPrinter As Long 'handle for the current printer Dim pd As PRINTER_DEFAULTS Dim pinfo As PRINTER_INFO_2 Dim dm As DEVMODE Dim sPrinterName As String Dim yDevModeData() As Byte 'Byte array to hold contents 'of DEVMODE structure Dim yPInfoMemory() As Byte 'Byte array to hold contents 'of PRINTER_INFO_2 structure Dim iBytesNeeded As Long Dim iRet As Long Dim iJunk As Long Dim iCount As Long On Error GoTo cleanup 'Get the name of the current printer sPrinterName = Trim$(Left$(ActivePrinter, _ InStr(ActivePrinter, " on "))) pd.DesiredAccess = PRINTER_NORMAL_ACCESS iRet = OpenPrinter(sPrinterName, hPrinter, pd) If (iRet = 0) Or (hPrinter = 0) Then 'Can't access current printer. Bail out doing nothing Exit Function End If 'Get the size of the DEVMODE structure to be loaded iRet = DocumentProperties(0, hPrinter, sPrinterName, 0, 0, 0) If (iRet < 0) Then 'Can't access printer properties. GoTo cleanup End If 'Make sure the
From: Lüko Willms on 14 Nov 2006 06:55 Am Mon, 13 Nov 2006 10:08:52 UTC, schrieb "Senad Isanovic" <senados(a)home.se> auf microsoft.public.word.vba.general : > This code works fine if you have Admin rights, otherwise I cann't acces the > current (network) printer. Please any suggestions? How about just Print Operator rights? Yours, L.W.
From: Senad Isanovic on 15 Nov 2006 08:47 Yes it works if you have Print Operator, but not with only Print permission. Is it supposed to be that way, otherwise you cannot access printer properties via API? "L?ko Willms" <l.willms(a)domain.invalid> skrev i meddelandet news:czd2LKcn8EGd-pn2-gxtnqhPNrjyO(a)lueko.willms.dialin.t-online.de... > Am Mon, 13 Nov 2006 10:08:52 UTC, schrieb "Senad Isanovic" > <senados(a)home.se> auf microsoft.public.word.vba.general : > >> This code works fine if you have Admin rights, otherwise I cann't acces >> the >> current (network) printer. Please any suggestions? > > How about just Print Operator rights? > > > Yours, > L.W. >
From: Lüko Willms on 16 Nov 2006 00:47
Am Wed, 15 Nov 2006 13:47:09 UTC, schrieb "Senad Isanovic" <senados(a)home.se> auf microsoft.public.word.vba.general : > Yes it works if you have Print Operator, but not with only Print permission. > Is it supposed to be that way, it seems so. Frankly, I do not really understand well those built-in groups in Windows-NT. > otherwise you cannot access printer properties via API? probably not by any other means, too. Yours, L.W. 8 |