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 / samples4 / ch12 / frmwatch.frm (.txt) < prev    next >
Encoding:
Visual Basic Form  |  1996-02-16  |  6.5 KB  |  177 lines

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