home *** CD-ROM | disk | FTP | other *** search
/ Dan Appleman's Visual Bas…s Guide to the Win32 API / Dan.Applmans.Visual.Basic.5.0.Programmers.Guide.To.The.Win32.API.1997.Ziff-Davis.Press.CD / VB5PG32.mdf / vbpg32 / samples5 / ch12 / frmwatch.frm (.txt) < prev    next >
Encoding:
Visual Basic Form  |  1997-02-16  |  6.5 KB  |  176 lines

  1. VERSION 5.00
  2. Begin VB.Form frmWatch 
  3.    Caption         =   "Job Watch"
  4.    ClientHeight    =   2595
  5.    ClientLeft      =   1095
  6.    ClientTop       =   1515
  7.    ClientWidth     =   4485
  8.    LinkTopic       =   "Form1"
  9.    PaletteMode     =   1  'UseZOrder
  10.    ScaleHeight     =   2595
  11.    ScaleWidth      =   4485
  12.    Begin VB.TextBox txtPrinter 
  13.       Height          =   315
  14.       Left            =   1440
  15.       TabIndex        =   1
  16.       Text            =   "HPLJ5"
  17.       Top             =   360
  18.       Width           =   1035
  19.    End
  20.    Begin VB.CommandButton cmdWatch 
  21.       Caption         =   "Watch"
  22.       Height          =   495
  23.       Left            =   3000
  24.       TabIndex        =   0
  25.       Top             =   300
  26.       Width           =   1095
  27.    End
  28.    Begin VB.Label Label1 
  29.       Alignment       =   1  'Right Justify
  30.       Caption         =   "Printer Name:"
  31.       Height          =   195
  32.       Left            =   60
  33.       TabIndex        =   2
  34.       Top             =   420
  35.       Width           =   1335
  36.    End
  37. Attribute VB_Name = "frmWatch"
  38. Attribute VB_GlobalNameSpace = False
  39. Attribute VB_Creatable = False
  40. Attribute VB_PredeclaredId = True
  41. Attribute VB_Exposed = False
  42. Option Explicit
  43. ' Copyright 
  44.  1997 by Desaware Inc. All Rights Reserved.
  45. Private Type PRINTER_NOTIFY_OPTIONS
  46.     Version As Long
  47.     Flags As Long
  48.     Count As Long
  49.     pTypes As Long
  50. End Type
  51. Private Type PRINTER_NOTIFY_OPTIONS_TYPE
  52.     Type As Integer
  53.     Reserved0 As Integer
  54.     Reserved1 As Long
  55.     Reserved2 As Long
  56.     Count As Long
  57.     pFields As Long
  58. End Type
  59. Private Type PRINTER_NOTIFY_INFO
  60.     Version As Long
  61.     Flags As Long
  62.     Count As Long
  63. End Type
  64. Private Type PRINTER_NOTIFY_INFO_DATA
  65.     Type As Integer
  66.     Field As Integer
  67.     Reserved As Long
  68.     Id As Long
  69.     Buf As Long
  70. End Type
  71. Private Type PRINTER_DEFAULTS
  72.         pDatatype As String
  73.         pDevMode As Long
  74.         DesiredAccess As Long
  75. End Type
  76. '**********************************
  77. '**  Constant Definitions:
  78. #If Win32 Then
  79. Private Const PRINTER_CHANGE_ADD_FORM& = &H10000
  80. Private Const PRINTER_CHANGE_ADD_JOB& = &H100
  81. Private Const PRINTER_CHANGE_ADD_PORT& = &H100000
  82. Private Const PRINTER_CHANGE_ADD_PRINT_PROCESSOR& = &H1000000
  83. Private Const PRINTER_CHANGE_ADD_PRINTER& = &H1
  84. Private Const PRINTER_CHANGE_ADD_PRINTER_DRIVER& = &H10000000
  85. Private Const PRINTER_CHANGE_ALL& = &H7777FFFF
  86. Private Const PRINTER_CHANGE_CONFIGURE_PORT& = &H200000
  87. Private Const PRINTER_CHANGE_DELETE_FORM& = &H40000
  88. Private Const PRINTER_CHANGE_DELETE_JOB& = &H400
  89. Private Const PRINTER_CHANGE_DELETE_PRINT_PROCESSOR& = &H4000000
  90. Private Const PRINTER_CHANGE_DELETE_PRINTER& = &H4
  91. Private Const PRINTER_CHANGE_FORM& = &H70000
  92. Private Const PRINTER_CHANGE_JOB& = &HFF00
  93. Private Const PRINTER_CHANGE_PORT& = &H700000
  94. Private Const PRINTER_CHANGE_PRINT_PROCESSOR& = &H7000000
  95. Private Const PRINTER_CHANGE_PRINTER& = &HFF
  96. Private Const PRINTER_CHANGE_PRINTER_DRIVER& = &H70000000
  97. Private Const PRINTER_CHANGE_SET_FORM& = &H20000
  98. Private Const PRINTER_CHANGE_SET_JOB& = &H200
  99. Private Const PRINTER_CHANGE_SET_PRINTER& = &H2
  100. Private Const PRINTER_CHANGE_TIMEOUT& = &H80000000
  101. Private Const PRINTER_CHANGE_WRITE_JOB& = &H800
  102. Private Const WAIT_FAILED = -1&
  103. Private Const WAIT_OBJECT_0 = 0
  104. Private Const WAIT_ABANDONED = &H80&
  105. Private Const WAIT_ABANDONED_0 = &H80&
  106. Private Const WAIT_TIMEOUT = &H102&
  107. Private Const WAIT_IO_COMPLETION = &HC0&
  108. Private Const STILL_ACTIVE = &H103&
  109. Private Const INFINITE = -1&
  110. Private Const PRINTER_ACCESS_ADMINISTER = &H4
  111. #End If 'WIN32
  112. '**********************************
  113. '**  Function Declarations:
  114. #If Win32 Then
  115. Private Declare Function FindFirstPrinterChangeNotification& Lib "winspool.drv" (ByVal hPrinter As Long, ByVal fdwFlags As Long, ByVal fdwOptions As Long, ByVal pPrinterNotifyOptions As Long)
  116. Private Declare Function FindNextPrinterChangeNotification& Lib "winspool.drv" (ByVal hChange As Long, pdwChange As Long, ByVal pvReserved As Long, ppPrinterNotifyInfo As Long)
  117. Private Declare Function FindClosePrinterChangeNotification& Lib "winspool.drv" (ByVal hChange As Long)
  118. Private Declare Function FreePrinterNotifyInfo Lib "winspool.drv" (ByVal addr As Long) As Long
  119. Private Declare Function OpenPrinter& Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS)
  120. Private Declare Function ClosePrinter& Lib "winspool.drv" (ByVal hPrinter As Long)
  121. Private Declare Function WaitForSingleObject& Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long)
  122. #End If 'WIN32
  123. Dim NotificationObject&
  124. Dim prhandle&
  125. Private Sub cmdWatch_Click()
  126.     Dim res&
  127.     Dim signalflags&
  128.     Dim x&
  129.     Dim mbres&
  130.     mbres = vbOK
  131.     Dim prnotify As PRINTER_NOTIFY_INFO
  132.     Dim prData As PRINTER_NOTIFY_INFO_DATA
  133.     Dim prDefault As PRINTER_DEFAULTS
  134.     prDefault.pDatatype = vbNullString
  135.     prDefault.pDevMode = 0
  136.     prDefault.DesiredAccess = PRINTER_ACCESS_ADMINISTER
  137.     If prhandle <> 0 Then Call ClosePrinter(prhandle)
  138.     res = OpenPrinter(txtPrinter.Text, prhandle, prDefault)
  139.     If res = 0 Then
  140.         MsgBox "Can't open specified printer"
  141.         Exit Sub
  142.     End If
  143.     ' Create a notification object that will change
  144.     ' when a job is added or removed
  145.     NotificationObject = FindFirstPrinterChangeNotification(prhandle, PRINTER_CHANGE_JOB, 0, 0)
  146.     If NotificationObject = 0 Then
  147.         MsgBox "Unable to create notification object"
  148.         Exit Sub
  149.     End If
  150.     Visible = False
  151.     Do  ' This loop will never exit
  152.         ' Extend this example so that it watches for an exit
  153.         ' condition.  The cleanup code is already in place
  154.         res = WaitForSingleObject(NotificationObject, 20000)
  155.         If res = WAIT_TIMEOUT Then
  156.             mbres = MsgBox("Timed out", vbOKCancel)
  157.         Else
  158.             res = FindNextPrinterChangeNotification(NotificationObject, signalflags&, 0, 0)
  159.             ' Now, what happened?
  160.             If signalflags And PRINTER_CHANGE_ADD_JOB <> 0 Then
  161.                 Beep
  162.                 MsgBox "Job was added"
  163.             End If
  164.             If signalflags And PRINTER_CHANGE_DELETE_JOB <> 0 Then
  165.                 Beep
  166.                 MsgBox "Job was deleted"
  167.             End If
  168.         End If
  169.     Loop While mbres <> vbCancel
  170.     Visible = True
  171. End Sub
  172. Private Sub Form_Unload(Cancel As Integer)
  173.     If NotificationObject <> 0 Then Call FindClosePrinterChangeNotification(NotificationObject)
  174.     If prhandle <> 0 Then ClosePrinter prhandle
  175. End Sub
  176.