In my shutdown program -- which defrags the harddrive with Diskeeper Lite, scans for spyware with AdAware and then scans for viruses with AVG before powering down -- I want it to warn me if I left the printer on.
Searching for existing threads uncovered this post, which links to this article. But that article is poorly constructed; it doesn't offer functional code.
Can anyone help me piece it together? This is what I have so far:Code:Option Explicit Public Enum Printer_Status PRINTER_STATUS_READY = &H0 PRINTER_STATUS_PAUSED = &H1 PRINTER_STATUS_ERROR = &H2 PRINTER_STATUS_PENDING_DELETION = &H4 PRINTER_STATUS_PAPER_JAM = &H8 PRINTER_STATUS_PAPER_OUT = &H10 PRINTER_STATUS_MANUAL_FEED = &H20 PRINTER_STATUS_PAPER_PROBLEM = &H40 PRINTER_STATUS_OFFLINE = &H80 PRINTER_STATUS_IO_ACTIVE = &H100 PRINTER_STATUS_BUSY = &H200 PRINTER_STATUS_PRINTING = &H400 PRINTER_STATUS_OUTPUT_BIN_FULL = &H800 PRINTER_STATUS_NOT_AVAILABLE = &H1000 PRINTER_STATUS_WAITING = &H2000 PRINTER_STATUS_PROCESSING = &H4000 PRINTER_STATUS_INITIALIZING = &H8000 PRINTER_STATUS_WARMING_UP = &H10000 PRINTER_STATUS_TONER_LOW = &H20000 PRINTER_STATUS_NO_TONER = &H40000 PRINTER_STATUS_PAGE_PUNT = &H80000 PRINTER_STATUS_USER_INTERVENTION = &H100000 PRINTER_STATUS_OUT_OF_MEMORY = &H200000 PRINTER_STATUS_DOOR_OPEN = &H400000 PRINTER_STATUS_SERVER_UNKNOWN = &H800000 PRINTER_STATUS_POWER_SAVE = &H1000000 End Enum Private Type PRINTER_INFO_2 pServerName As String pPrinterName As String pShareName As String pPortName As String pDriverName As String pComment As String pLocation As String pDevMode As Long pSepFile As String pPrintProcessor As String pDatatype As String pParameters As String pSecurityDescriptor As Long Attributes As Long Priority As Long DefaultPriority As Long StartTime As Long UntilTime As Long Status As Long JobsCount As Long AveragePPM As Long End Type Private Const CCHDEVICENAME = 32 Private Const CCHFORMNAME = 32 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 PRINTER_DEFAULTS pDatatype As String pDevMode As DEVMODE DesiredAccess As Long End Type Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long Private Declare Function GetPrinterApi Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, buffer As Long, ByVal pbSize As Long, pbSizeNeeded 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 Sub Command1_Click() Dim lret As Long Dim pDef As PRINTER_DEFAULTS Dim mhPrinter As Long Dim Index As Long lret = OpenPrinter(Printer.DeviceName, mhPrinter, pDef) Dim SizeNeeded As Long Dim buffer() As Long ReDim Preserve buffer(0 To 1) As Long lret = GetPrinterApi(mhPrinter, Index, buffer(0), UBound(buffer), SizeNeeded) ReDim Preserve buffer(0 To (SizeNeeded / 4) + 3) As Long lret = GetPrinterApi(mhPrinter, Index, buffer(0), UBound(buffer) * 4, SizeNeeded) Dim mPRINTER_INFO_2 As PRINTER_INFO_2 With mPRINTER_INFO_2 '\\ This variable is of type PRINTER_INFO_2 .pServerName = StringFromPointer(buffer(0), 1024) .pPrinterName = StringFromPointer(buffer(1), 1024) .pShareName = StringFromPointer(buffer(2), 1024) .pPortName = StringFromPointer(buffer(3), 1024) .pDriverName = StringFromPointer(buffer(4), 1024) .pComment = StringFromPointer(buffer(5), 1024) .pLocation = StringFromPointer(buffer(6), 1024) .pDevMode = buffer(7) .pSepFile = StringFromPointer(buffer(8), 1024) .pPrintProcessor = StringFromPointer(buffer(9), 1024) .pDatatype = StringFromPointer(buffer(10), 1024) .pParameters = StringFromPointer(buffer(11), 1024) .pSecurityDescriptor = buffer(12) .Attributes = buffer(13) .Priority = buffer(14) .DefaultPriority = buffer(15) .StartTime = buffer(16) .UntilTime = buffer(17) .Status = buffer(18) .JobsCount = buffer(19) .AveragePPM = buffer(20) End With ClosePrinter mhPrinter End Sub Public Function StringFromPointer(lpString As Long, lMaxLength As Long) As String Dim sRet As String Dim lret As Long If lpString = 0 Then StringFromPointer = "" Exit Function End If If IsBadStringPtrByLong(lpString, lMaxLength) Then '\\ An error has occured - do not attempt to use this pointer StringFromPointer = "" Exit Function End If '\\ Pre-initialise the return string... sRet = Space$(lMaxLength) CopyMemory ByVal sRet, ByVal lpString, ByVal Len(sRet) If Err.LastDllError = 0 Then If InStr(sRet, Chr$(0)) > 0 Then sRet = Left$(sRet, InStr(sRet, Chr$(0)) - 1) End If End If StringFromPointer = sRet End Function




Reply With Quote