home *** CD-ROM | disk | FTP | other *** search
Wrap
VERSION 5.00 Begin VB.Form frmWatch Caption = "Job Watch" ClientHeight = 2595 ClientLeft = 1095 ClientTop = 1515 ClientWidth = 4485 LinkTopic = "Form1" PaletteMode = 1 'UseZOrder ScaleHeight = 2595 ScaleWidth = 4485 Begin VB.TextBox txtPrinter Height = 315 Left = 1440 TabIndex = 1 Text = "HPLJ5" Top = 360 Width = 1035 End Begin VB.CommandButton cmdWatch Caption = "Watch" Height = 495 Left = 3000 TabIndex = 0 Top = 300 Width = 1095 End Begin VB.Label Label1 Alignment = 1 'Right Justify Caption = "Printer Name:" Height = 195 Left = 60 TabIndex = 2 Top = 420 Width = 1335 End Attribute VB_Name = "frmWatch" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False Option Explicit ' Copyright 1997 by Desaware Inc. All Rights Reserved. Private Type PRINTER_NOTIFY_OPTIONS Version As Long Flags As Long Count As Long pTypes As Long End Type Private Type PRINTER_NOTIFY_OPTIONS_TYPE Type As Integer Reserved0 As Integer Reserved1 As Long Reserved2 As Long Count As Long pFields As Long End Type Private Type PRINTER_NOTIFY_INFO Version As Long Flags As Long Count As Long End Type Private Type PRINTER_NOTIFY_INFO_DATA Type As Integer Field As Integer Reserved As Long Id As Long Buf As Long End Type Private Type PRINTER_DEFAULTS pDatatype As String pDevMode As Long DesiredAccess As Long End Type '********************************** '** Constant Definitions: #If Win32 Then Private Const PRINTER_CHANGE_ADD_FORM& = &H10000 Private Const PRINTER_CHANGE_ADD_JOB& = &H100 Private Const PRINTER_CHANGE_ADD_PORT& = &H100000 Private Const PRINTER_CHANGE_ADD_PRINT_PROCESSOR& = &H1000000 Private Const PRINTER_CHANGE_ADD_PRINTER& = &H1 Private Const PRINTER_CHANGE_ADD_PRINTER_DRIVER& = &H10000000 Private Const PRINTER_CHANGE_ALL& = &H7777FFFF Private Const PRINTER_CHANGE_CONFIGURE_PORT& = &H200000 Private Const PRINTER_CHANGE_DELETE_FORM& = &H40000 Private Const PRINTER_CHANGE_DELETE_JOB& = &H400 Private Const PRINTER_CHANGE_DELETE_PRINT_PROCESSOR& = &H4000000 Private Const PRINTER_CHANGE_DELETE_PRINTER& = &H4 Private Const PRINTER_CHANGE_FORM& = &H70000 Private Const PRINTER_CHANGE_JOB& = &HFF00 Private Const PRINTER_CHANGE_PORT& = &H700000 Private Const PRINTER_CHANGE_PRINT_PROCESSOR& = &H7000000 Private Const PRINTER_CHANGE_PRINTER& = &HFF Private Const PRINTER_CHANGE_PRINTER_DRIVER& = &H70000000 Private Const PRINTER_CHANGE_SET_FORM& = &H20000 Private Const PRINTER_CHANGE_SET_JOB& = &H200 Private Const PRINTER_CHANGE_SET_PRINTER& = &H2 Private Const PRINTER_CHANGE_TIMEOUT& = &H80000000 Private Const PRINTER_CHANGE_WRITE_JOB& = &H800 Private Const WAIT_FAILED = -1& Private Const WAIT_OBJECT_0 = 0 Private Const WAIT_ABANDONED = &H80& Private Const WAIT_ABANDONED_0 = &H80& Private Const WAIT_TIMEOUT = &H102& Private Const WAIT_IO_COMPLETION = &HC0& Private Const STILL_ACTIVE = &H103& Private Const INFINITE = -1& Private Const PRINTER_ACCESS_ADMINISTER = &H4 #End If 'WIN32 '********************************** '** Function Declarations: #If Win32 Then Private Declare Function FindFirstPrinterChangeNotification& Lib "winspool.drv" (ByVal hPrinter As Long, ByVal fdwFlags As Long, ByVal fdwOptions As Long, ByVal pPrinterNotifyOptions As Long) Private Declare Function FindNextPrinterChangeNotification& Lib "winspool.drv" (ByVal hChange As Long, pdwChange As Long, ByVal pvReserved As Long, ppPrinterNotifyInfo As Long) Private Declare Function FindClosePrinterChangeNotification& Lib "winspool.drv" (ByVal hChange As Long) Private Declare Function FreePrinterNotifyInfo Lib "winspool.drv" (ByVal addr As Long) As Long Private Declare Function OpenPrinter& Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) Private Declare Function ClosePrinter& Lib "winspool.drv" (ByVal hPrinter As Long) Private Declare Function WaitForSingleObject& Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) #End If 'WIN32 Dim NotificationObject& Dim prhandle& Private Sub cmdWatch_Click() Dim res& Dim signalflags& Dim x& Dim mbres& mbres = vbOK Dim prnotify As PRINTER_NOTIFY_INFO Dim prData As PRINTER_NOTIFY_INFO_DATA Dim prDefault As PRINTER_DEFAULTS prDefault.pDatatype = vbNullString prDefault.pDevMode = 0 prDefault.DesiredAccess = PRINTER_ACCESS_ADMINISTER If prhandle <> 0 Then Call ClosePrinter(prhandle) res = OpenPrinter(txtPrinter.Text, prhandle, prDefault) If res = 0 Then MsgBox "Can't open specified printer" Exit Sub End If ' Create a notification object that will change ' when a job is added or removed NotificationObject = FindFirstPrinterChangeNotification(prhandle, PRINTER_CHANGE_JOB, 0, 0) If NotificationObject = 0 Then MsgBox "Unable to create notification object" Exit Sub End If Visible = False Do ' This loop will never exit ' Extend this example so that it watches for an exit ' condition. The cleanup code is already in place res = WaitForSingleObject(NotificationObject, 20000) If res = WAIT_TIMEOUT Then mbres = MsgBox("Timed out", vbOKCancel) Else res = FindNextPrinterChangeNotification(NotificationObject, signalflags&, 0, 0) ' Now, what happened? If signalflags And PRINTER_CHANGE_ADD_JOB <> 0 Then Beep MsgBox "Job was added" End If If signalflags And PRINTER_CHANGE_DELETE_JOB <> 0 Then Beep MsgBox "Job was deleted" End If End If Loop While mbres <> vbCancel Visible = True End Sub Private Sub Form_Unload(Cancel As Integer) If NotificationObject <> 0 Then Call FindClosePrinterChangeNotification(NotificationObject) If prhandle <> 0 Then ClosePrinter prhandle End Sub