文章編號: 202480 - 上次校閱: 2004年7月16日 - 版次: 1.1

如何: 判斷印表機狀態,以及從 Visual Basic 的列印工作狀態

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

結論

本文將告訴您,如何使用 Windows 應用程式發展介面 (API) 函數,在 Visual Basic 來以程式設計方式判斷印表機狀態或列印工作狀態。雖然應用程式通常不一定要檢查印表機在列印之前的狀態,可能有幫助判斷印表機的狀態,或以程式設計的方式列印工作。

該技巧的描述

詞彙 「 印表機 」 可以參照硬體裝置、 佇列、 一個驅動程式或甚至連接埠。在這篇文章詞彙 「 印表機 」 定義為本機列印佇列。本文中的程式碼範例會傳回作業系統報告的狀態。這是相同狀態的多工緩衝處理程式會報告,而您可以藉由監看本機列印佇列檢查。

比方說欲佇列正在執行 Microsoft Windows 98 的電腦上,按一下 [開始]、 指向 [設定]、 按一下 [印表機,並再連按兩下您想要檢視其佇列印表機的圖示。

注意: 您無法直接與實體印表機通訊。您不應該這麼做,因為作業系統必須裁定硬體的存取。

本文中的範例程式碼會檢查本機列印佇列,會從連接埠監視器而又會與實體裝置進行通訊中取得的資訊。更詳細的方式描述,請參閱本文 < 參考 > 一節中所列的文件。

這個範例會報告狀態從印表機和工作,但請注意工作狀態資訊是一般的應用程式更可靠。在理想的情況下,您應該分別,檢查作業和印表機狀態,程式碼應該推斷佇列的 「 中繼 」 狀態。不過,對於大多數使用您的程式碼可以依賴工作狀態。而且,本範例循環作業,並檢查並報告每個工作狀態。這是因為您的工作可能會遵循報告例如位超出紙張或取得故障問題的另一個工作。

注意: 當系統有多工緩衝處理的工作時,系統只檢查狀態。否則,佇列被視為 「 就緒 」,因為佇列可以接受工作,即使硬體處於錯誤狀態。比方說如果已列印的最後一個作業使用的紙張 「 最後一個項目,作業系統並不知道這直到系統嘗試重新列印。

此外,雖然個可能會報告的許多狀態但許多不支援在練習中。印表機硬體和連接埠監視器判斷哪一個狀態報表。比方說如果印表機紙張用完與離線,狀態可能會報告為列印",因為的是作業想要做什麼。因此,顯示 「 就緒 」 的佇列並不保證您的列印工作會順利完成。

這個程式碼範例會檢查只有本機佇列,這對於大部分應用程式應該夠了。不過,連線到遠端印表機可能會變得相當複雜。您可以鏈結已實際上另一個佇列本機佇列連接埠的佇列。您可以讓印表機多工緩衝處理,從一般的超級佇列工作網頁時,其中多台印表機。當架構變得更複雜的時程式碼擷取有意義的狀態也變得更複雜,並及活用的狀態會降低。

在 Microsoft Windows 95、 Microsoft Windows 98 和 Microsoft Windows 千禧版只,您也可以檢查位元 PRINTER_ATTRIBUTE_WORK_OFFLINE [PrinterInfo.Attributes 欄位。此狀態是通常是由於使用者動作 (比方說如果使用者在印表機圖示上按一下滑鼠右鍵,然後按一下 [離線工作) 的項目。此狀態雖然作業系統可以強制狀態,如果印表機無法連線到 despool 工作不會因為列印工作的狀態變更的發生。在這種情況下狀態通常是以 USER_INERVENTION_REQUIRED 報告。

雖說是逐步範例

  1. 建立新的標準 EXE 專案在 Visual Basic 中時。依照預設值,會建立 Form1。
  2. 在 [專案] 功能表上按一下 [加入模組,],然後再新增下列程式碼:
    Option Explicit
    
    Public Declare Function lstrcpy Lib "kernel32" _
       Alias "lstrcpyA" _
       (ByVal lpString1 As String, _
       ByVal lpString2 As String) _
       As Long
    
    Public Declare Function OpenPrinter Lib "winspool.drv" _
       Alias "OpenPrinterA" _
       (ByVal pPrinterName As String, _
       phPrinter As Long, _
       pDefault As PRINTER_DEFAULTS) _
       As Long
    
    Public 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
    
    Public Declare Function ClosePrinter Lib "winspool.drv" _
       (ByVal hPrinter As Long) _
       As Long
    
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
       (Destination As Any, _
       Source As Any, _
       ByVal Length As Long)
    
    Public Declare Function EnumJobs Lib "winspool.drv" Alias "EnumJobsA" _
       (ByVal hPrinter As Long, _
       ByVal FirstJob As Long, _
       ByVal NoJobs As Long, _
       ByVal Level As Long, _
       pJob As Byte, _
       ByVal cdBuf As Long, _
       pcbNeeded As Long, _
       pcReturned As Long) _
       As Long
       
    ' constants for PRINTER_DEFAULTS structure
    Public Const PRINTER_ACCESS_USE = &H8
    Public Const PRINTER_ACCESS_ADMINISTER = &H4
    
    ' constants for DEVMODE structure
    Public Const CCHDEVICENAME = 32
    Public Const CCHFORMNAME = 32
    
    Public Type PRINTER_DEFAULTS
       pDatatype As String
       pDevMode As Long
       DesiredAccess As Long
    End Type
    
    Public 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
       dmLogPixels As Integer
       dmBitsPerPel As Long
       dmPelsWidth As Long
       dmPelsHeight As Long
       dmDisplayFlags As Long
       dmDisplayFrequency As Long
    End Type
    
    Type SYSTEMTIME
       wYear As Integer
       wMonth As Integer
       wDayOfWeek As Integer
       wDay As Integer
       wHour As Integer
       wMinute As Integer
       wSecond As Integer
       wMilliseconds As Integer
    End Type
    
    Type JOB_INFO_2
       JobId As Long
       pPrinterName As Long
       pMachineName As Long
       pUserName As Long
       pDocument As Long
       pNotifyName As Long
       pDatatype As Long
       pPrintProcessor As Long
       pParameters As Long
       pDriverName As Long
       pDevMode As Long
       pStatus As Long
       pSecurityDescriptor As Long
       Status As Long
       Priority As Long
       Position As Long
       StartTime As Long
       UntilTime As Long
       TotalPages As Long
       Size As Long
       Submitted As SYSTEMTIME
       time As Long
       PagesPrinted As Long
    End Type
    
    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
       pSepFile As Long
       pPrintProcessor As Long
       pDatatype As Long
       pParameters As Long
       pSecurityDescriptor As Long
       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
    
    Public Const ERROR_INSUFFICIENT_BUFFER = 122
    Public Const PRINTER_STATUS_BUSY = &H200
    Public Const PRINTER_STATUS_DOOR_OPEN = &H400000
    Public Const PRINTER_STATUS_ERROR = &H2
    Public Const PRINTER_STATUS_INITIALIZING = &H8000
    Public Const PRINTER_STATUS_IO_ACTIVE = &H100
    Public Const PRINTER_STATUS_MANUAL_FEED = &H20
    Public Const PRINTER_STATUS_NO_TONER = &H40000
    Public Const PRINTER_STATUS_NOT_AVAILABLE = &H1000
    Public Const PRINTER_STATUS_OFFLINE = &H80
    Public Const PRINTER_STATUS_OUT_OF_MEMORY = &H200000
    Public Const PRINTER_STATUS_OUTPUT_BIN_FULL = &H800
    Public Const PRINTER_STATUS_PAGE_PUNT = &H80000
    Public Const PRINTER_STATUS_PAPER_JAM = &H8
    Public Const PRINTER_STATUS_PAPER_OUT = &H10
    Public Const PRINTER_STATUS_PAPER_PROBLEM = &H40
    Public Const PRINTER_STATUS_PAUSED = &H1
    Public Const PRINTER_STATUS_PENDING_DELETION = &H4
    Public Const PRINTER_STATUS_PRINTING = &H400
    Public Const PRINTER_STATUS_PROCESSING = &H4000
    Public Const PRINTER_STATUS_TONER_LOW = &H20000
    Public Const PRINTER_STATUS_USER_INTERVENTION = &H100000
    Public Const PRINTER_STATUS_WAITING = &H2000
    Public Const PRINTER_STATUS_WARMING_UP = &H10000
    Public Const JOB_STATUS_PAUSED = &H1
    Public Const JOB_STATUS_ERROR = &H2
    Public Const JOB_STATUS_DELETING = &H4
    Public Const JOB_STATUS_SPOOLING = &H8
    Public Const JOB_STATUS_PRINTING = &H10
    Public Const JOB_STATUS_OFFLINE = &H20
    Public Const JOB_STATUS_PAPEROUT = &H40
    Public Const JOB_STATUS_PRINTED = &H80
    Public Const JOB_STATUS_DELETED = &H100
    Public Const JOB_STATUS_BLOCKED_DEVQ = &H200
    Public Const JOB_STATUS_USER_INTERVENTION = &H400
    Public Const JOB_STATUS_RESTART = &H800
    
    Public Function GetString(ByVal PtrStr As Long) As String
       Dim StrBuff As String * 256
       
       'Check for zero address
       If PtrStr = 0 Then
          GetString = " "
          Exit Function
       End If
       
       'Copy data from PtrStr to buffer.
       CopyMemory ByVal StrBuff, ByVal PtrStr, 256
       
       'Strip any trailing nulls from string.
       GetString = StripNulls(StrBuff)
    End Function
    
    Public Function StripNulls(OriginalStr As String) As String
       'Strip any trailing nulls from input string.
       If (InStr(OriginalStr, Chr(0)) > 0) Then
          OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
       End If
    
       'Return modified string.
       StripNulls = OriginalStr
    End Function
    
    Public Function PtrCtoVbString(Add As Long) As String
        Dim sTemp As String * 512
        Dim x As Long
    
        x = lstrcpy(sTemp, Add)
        If (InStr(1, sTemp, Chr(0)) = 0) Then
             PtrCtoVbString = ""
        Else
             PtrCtoVbString = Left(sTemp, InStr(1, sTemp, Chr(0)) - 1)
        End If
    End Function
    
    Public Function CheckPrinterStatus(PI2Status As Long) As String
       Dim tempStr As String
       
       If PI2Status = 0 Then   ' Return "Ready"
          CheckPrinterStatus = "Printer Status = Ready" & vbCrLf
       Else
          tempStr = ""   ' Clear
          If (PI2Status And PRINTER_STATUS_BUSY) Then
             tempStr = tempStr & "Busy  "
          End If
          
          If (PI2Status And PRINTER_STATUS_DOOR_OPEN) Then
             tempStr = tempStr & "Printer Door Open  "
          End If
          
          If (PI2Status And PRINTER_STATUS_ERROR) Then
             tempStr = tempStr & "Printer Error  "
          End If
          
          If (PI2Status And PRINTER_STATUS_INITIALIZING) Then
             tempStr = tempStr & "Initializing  "
          End If
          
          If (PI2Status And PRINTER_STATUS_IO_ACTIVE) Then
             tempStr = tempStr & "I/O Active  "
          End If
    
          If (PI2Status And PRINTER_STATUS_MANUAL_FEED) Then
             tempStr = tempStr & "Manual Feed  "
          End If
          
          If (PI2Status And PRINTER_STATUS_NO_TONER) Then
             tempStr = tempStr & "No Toner  "
          End If
          
          If (PI2Status And PRINTER_STATUS_NOT_AVAILABLE) Then
             tempStr = tempStr & "Not Available  "
          End If
          
          If (PI2Status And PRINTER_STATUS_OFFLINE) Then
             tempStr = tempStr & "Off Line  "
          End If
          
          If (PI2Status And PRINTER_STATUS_OUT_OF_MEMORY) Then
             tempStr = tempStr & "Out of Memory  "
          End If
          
          If (PI2Status And PRINTER_STATUS_OUTPUT_BIN_FULL) Then
             tempStr = tempStr & "Output Bin Full  "
          End If
          
          If (PI2Status And PRINTER_STATUS_PAGE_PUNT) Then
             tempStr = tempStr & "Page Punt  "
          End If
          
          If (PI2Status And PRINTER_STATUS_PAPER_JAM) Then
             tempStr = tempStr & "Paper Jam  "
          End If
    
          If (PI2Status And PRINTER_STATUS_PAPER_OUT) Then
             tempStr = tempStr & "Paper Out  "
          End If
          
          If (PI2Status And PRINTER_STATUS_OUTPUT_BIN_FULL) Then
             tempStr = tempStr & "Output Bin Full  "
          End If
          
          If (PI2Status And PRINTER_STATUS_PAPER_PROBLEM) Then
             tempStr = tempStr & "Page Problem  "
          End If
          
          If (PI2Status And PRINTER_STATUS_PAUSED) Then
             tempStr = tempStr & "Paused  "
          End If
    
          If (PI2Status And PRINTER_STATUS_PENDING_DELETION) Then
             tempStr = tempStr & "Pending Deletion  "
          End If
          
          If (PI2Status And PRINTER_STATUS_PRINTING) Then
             tempStr = tempStr & "Printing  "
          End If
          
          If (PI2Status And PRINTER_STATUS_PROCESSING) Then
             tempStr = tempStr & "Processing  "
          End If
          
          If (PI2Status And PRINTER_STATUS_TONER_LOW) Then
             tempStr = tempStr & "Toner Low  "
          End If
    
          If (PI2Status And PRINTER_STATUS_USER_INTERVENTION) Then
             tempStr = tempStr & "User Intervention  "
          End If
          
          If (PI2Status And PRINTER_STATUS_WAITING) Then
             tempStr = tempStr & "Waiting  "
          End If
          
          If (PI2Status And PRINTER_STATUS_WARMING_UP) Then
             tempStr = tempStr & "Warming Up  "
          End If
          
          'Did you find a known status?
          If Len(tempStr) = 0 Then
             tempStr = "Unknown Status of " & PI2Status
          End If
          
          'Return the Status
          CheckPrinterStatus = "Printer Status = " & tempStr & vbCrLf
       End If
    End Function
    					
  3. 新增三個 命令按鈕 控制項。
  4. 將三個 文字方塊 控制項加入至 Form1,然後設定 TextBox 控制項,如下所示:
    1. 將每個 文字方塊 控制項的 屬性設定為 True
    2. 調整每個 文字方塊 約五英吋寬和三英吋的大小。
    3. 將每個 文字方塊 控制項的 捲軸列 屬性設定為 [2-垂直
  5. Timer 控制項加入至 Form1。
  6. 將下列程式碼加入至表單的模組:
    Option Explicit
    
    Private Sub Command1_Click()
       'Enable the timer to begin printer status checks.
       Timer1.Enabled = True
       
       'Enable and disable start and stop buttons.
       Command1.Enabled = False
       Command2.Enabled = True
       Command3.Enabled = True
    End Sub
    
    Private Sub Command2_Click()
       'Disable timer to stop further printer checks.
       Timer1.Enabled = False
       
       'Enable and disable start and stop buttons.
       Command1.Enabled = True
       Command2.Enabled = False
       Command3.Enabled = True
    End Sub
    
    Private Sub Command3_Click()
       'Clear the status info.
       Text1.Text = ""
       Text2.Text = ""
       Text3.Text = ""
    End Sub
    
    Private Sub Form_Load()
       'Initialize captions for control buttons.
       Command1.Caption = "Start"
       Command2.Caption = "Stop"
       Command3.Caption = "Clear"
       
       'Clear the status info.
       Text1.Text = ""
       Text2.Text = ""
       Text3.Text = ""
       
       Command1.Enabled = True
       'Disable stop and clear buttons.
       Command2.Enabled = False
       Command3.Enabled = False
       
       'Set interval for printer status checking to 1/2 second.
       Timer1.Enabled = False
       Timer1.Interval = 500
    End Sub
    
    Private Sub Timer1_Timer()
       Dim PrinterStatus As String
       Dim JobStatus As String
       Dim ErrorInfo As String
       
       'Clear the status info for new info/status.
       Text1.Text = ""
       Text2.Text = ""
       Text3.Text = ""
       
       'Call sub to perform check.
       Text1.Text = CheckPrinter(PrinterStatus, JobStatus)
       Text2.Text = PrinterStatus
       Text3.Text = JobStatus
    End Sub
    
    Public Function CheckPrinter(PrinterStr As String, JobStr As String) As String
       Dim hPrinter As Long
       Dim ByteBuf As Long
       Dim BytesNeeded As Long
       Dim PI2 As PRINTER_INFO_2
       Dim JI2 As JOB_INFO_2
       Dim PrinterInfo() As Byte
       Dim JobInfo() As Byte
       Dim result As Long
       Dim LastError As Long
       Dim PrinterName As String
       Dim tempStr As String
       Dim NumJI2 As Long
       Dim pDefaults As PRINTER_DEFAULTS
       Dim I As Integer
       
       'Set a default return value if no errors occur.
       CheckPrinter = "Printer info retrieved"
       
       'NOTE: You can pick a printer from the Printers Collection
       'or use the EnumPrinters() API to select a printer name.
       
       'Use the default printer of Printers collection.
       'This is typically, but not always, the system default printer.
       PrinterName = Printer.DeviceName
       
       'Set desired access security setting.
       pDefaults.DesiredAccess = PRINTER_ACCESS_USE
       
       'Call API to get a handle to the printer.
       result = OpenPrinter(PrinterName, hPrinter, pDefaults)
       If result = 0 Then
          'If an error occurred, display an error and exit sub.
          CheckPrinter = "Cannot open printer " & PrinterName & _
             ", Error: " & Err.LastDllError
          Exit Function
       End If
    
       'Init BytesNeeded
       BytesNeeded = 0
    
       'Clear the error object of any errors.
       Err.Clear
    
       'Determine the buffer size that is needed to get printer info.
       result = GetPrinter(hPrinter, 2, 0&, 0&, BytesNeeded)
       
       'Check for error calling GetPrinter.
       If Err.LastDllError <> ERROR_INSUFFICIENT_BUFFER Then
          'Display an error message, close printer, and exit sub.
          CheckPrinter = " > GetPrinter Failed on initial call! <"
          ClosePrinter hPrinter
          Exit Function
       End If
       
       'Note that in Charles Petzold's book "Programming Windows 95," he
       'states that because of a problem with GetPrinter on Windows 95 only, you 
       'must allocate a buffer as much as three times larger than the value 
       'returned by the initial call to GetPrinter. This is not done here.
       ReDim PrinterInfo(1 To BytesNeeded)
       
       ByteBuf = BytesNeeded
       
       'Call GetPrinter to get the status.
       result = GetPrinter(hPrinter, 2, PrinterInfo(1), ByteBuf, _
         BytesNeeded)
       
       'Check for errors.
       If result = 0 Then
          'Determine the error that occurred.
          LastError = Err.LastDllError()
          
          'Display error message, close printer, and exit sub.
          CheckPrinter = "Couldn't get Printer Status!  Error = " _
             & LastError
          ClosePrinter hPrinter
          Exit Function
       End If
    
       'Copy contents of printer status byte array into a
       'PRINTER_INFO_2 structure to separate the individual elements.
       CopyMemory PI2, PrinterInfo(1), Len(PI2)
       
       'Check if printer is in ready state.
       PrinterStr = CheckPrinterStatus(PI2.Status)
       
       'Add printer name, driver, and port to list.
       PrinterStr = PrinterStr & "Printer Name = " & _
         GetString(PI2.pPrinterName) & vbCrLf
       PrinterStr = PrinterStr & "Printer Driver Name = " & _
         GetString(PI2.pDriverName) & vbCrLf
       PrinterStr = PrinterStr & "Printer Port Name = " & _
         GetString(PI2.pPortName) & vbCrLf
       
       'Call API to get size of buffer that is needed.
       result = EnumJobs(hPrinter, 0&, &HFFFFFFFF, 2, ByVal 0&, 0&, _
          BytesNeeded, NumJI2)
       
       'Check if there are no current jobs, and then display appropriate message.
       If BytesNeeded = 0 Then
          JobStr = "No Print Jobs!"
       Else
          'Redim byte array to hold info about print job.
          ReDim JobInfo(0 To BytesNeeded)
          
          'Call API to get print job info.
          result = EnumJobs(hPrinter, 0&, &HFFFFFFFF, 2, JobInfo(0), _
            BytesNeeded, ByteBuf, NumJI2)
          
          'Check for errors.
          If result = 0 Then
             'Get and display error, close printer, and exit sub.
             LastError = Err.LastDllError
             CheckPrinter = " > EnumJobs Failed on second call! <  Error = " _
                & LastError
             ClosePrinter hPrinter
             Exit Function
          End If
          
          'Copy contents of print job info byte array into a
          'JOB_INFO_2 structure to separate the individual elements.
          For I = 0 To NumJI2 - 1   ' Loop through jobs and walk the buffer
              CopyMemory JI2, JobInfo(I * Len(JI2)), Len(JI2)
                 
              ' List info available on Jobs.
              Debug.Print "Job ID" & vbTab & JI2.JobId
              Debug.Print "Name Of Printer" & vbTab & _
                GetString(JI2.pPrinterName)
              Debug.Print "Name Of Machine That Created Job" & vbTab & _
                GetString(JI2.pMachineName)
              Debug.Print "Print Job Owner's Name" & vbTab & _
                GetString(JI2.pUserName)
              Debug.Print "Name Of Document" & vbTab & GetString(JI2.pDocument)
              Debug.Print "Name Of User To Notify" & vbTab & _
                GetString(JI2.pNotifyName)
              Debug.Print "Type Of Data" & vbTab & GetString(JI2.pDatatype)
              Debug.Print "Print Processor" & vbTab & _
                GetString(JI2.pPrintProcessor)
              Debug.Print "Print Processor Parameters" & vbTab & _
                GetString(JI2.pParameters)
              Debug.Print "Print Driver Name" & vbTab & _
                GetString(JI2.pDriverName)
              Debug.Print "Print Job 'P' Status" & vbTab & _
                GetString(JI2.pStatus)
              Debug.Print "Print Job Status" & vbTab & JI2.Status
              Debug.Print "Print Job Priority" & vbTab & JI2.Priority
              Debug.Print "Position in Queue" & vbTab & JI2.Position
              Debug.Print "Earliest Time Job Can Be Printed" & vbTab & _
                JI2.StartTime
              Debug.Print "Latest Time Job Will Be Printed" & vbTab & _
                JI2.UntilTime
              Debug.Print "Total Pages For Entire Job" & vbTab & JI2.TotalPages
              Debug.Print "Size of Job In Bytes" & vbTab & JI2.Size
              'Because of a bug in Windows NT 3.51, the time member is not set correctly.
              'Therefore, do not use the time member on Windows NT 3.51.
              Debug.Print "Elapsed Print Time" & vbTab & JI2.time
              Debug.Print "Pages Printed So Far" & vbTab & JI2.PagesPrinted
                 
              'Display basic job status info.
              JobStr = JobStr & "Job ID = " & JI2.JobId & _
                 vbCrLf & "Total Pages = " & JI2.TotalPages & vbCrLf
              
              tempStr = ""   'Clear
              'Check for a ready state.
              If JI2.pStatus = 0& Then   ' If pStatus is Null, check Status.
                If JI2.Status = 0 Then
                   tempStr = tempStr & "Ready!  " & vbCrLf
                Else  'Check for the various print job states.
                   If (JI2.Status And JOB_STATUS_SPOOLING) Then
                      tempStr = tempStr & "Spooling  "
                   End If
                   
                   If (JI2.Status And JOB_STATUS_OFFLINE) Then
                      tempStr = tempStr & "Off line  "
                   End If
                   
                   If (JI2.Status And JOB_STATUS_PAUSED) Then
                      tempStr = tempStr & "Paused  "
                   End If
                   
                   If (JI2.Status And JOB_STATUS_ERROR) Then
                      tempStr = tempStr & "Error  "
                   End If
                   
                   If (JI2.Status And JOB_STATUS_PAPEROUT) Then
                      tempStr = tempStr & "Paper Out  "
                   End If
                   
                   If (JI2.Status And JOB_STATUS_PRINTING) Then
                      tempStr = tempStr & "Printing  "
                   End If
                   
                   If (JI2.Status And JOB_STATUS_USER_INTERVENTION) Then
                      tempStr = tempStr & "User Intervention Needed  "
                   End If
                   
                   If Len(tempStr) = 0 Then
                      tempStr = "Unknown Status of " & JI2.Status
                   End If
                End If
            Else
                ' Dereference pStatus.
                tempStr = PtrCtoVbString(JI2.pStatus)
            End If
              
              'Report the Job status.
              JobStr = JobStr & tempStr & vbCrLf
              Debug.Print JobStr & tempStr
          Next I
       End If
       
       'Close the printer handle.
       ClosePrinter hPrinter
    End Function
    					
  7. 前往您列印佇列,然後暫停印表機。請注意您可能需要本機印表機,而不是網路印表機暫停列印佇列。
  8. 執行範例的專案,然後按一下 [開始]
  9. 從另一個應用程式 (如 「 記事本 」 執行一或多個列印作業。印表機資訊會顯示在文字方塊中。請注意,工作詳細資料會出現在 [即時運算] 視窗中。
  10. 必要時,按一下 [表單捲動文字方塊和 [即時運算] 視窗來檢視此印表機的資訊上的 [停止]。

疑難排解

  • 只有特定的裝置驅動程式可以取得即時、 正確的印表機狀態資訊。這個程式碼會取得 Windows 多工緩衝處理程式會報告的狀態相同。
  • 確實報告的狀態可能會有所不同,不同的印表機和驅動程式。

?考

取得更多資訊有關印表機狀態和列印工作狀態的設定方式按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
160129? (http://support.microsoft.com/kb/160129/EN-US/ ) HOWTO: 取得印表機及列印工作的狀態
如需有關如何使用 EnumPrinters API 函式的詳細資訊,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
166008? (http://support.microsoft.com/kb/166008/EN-US/ ) ACC: 列舉本機及網路印表機
如需有關如何擷取 Microsoft Visual C++ 中的列印工作資訊的額外資訊,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中發行項]:
228769? (http://support.microsoft.com/kb/228769/EN-US/ ) HOWTO: 擷取列印工作資訊
158828? (http://support.microsoft.com/kb/158828/EN-US/ ) HOWTO: 如何呼叫 Win32 多工緩衝處理程式列舉 API 正確

這篇文章中的資訊適用於:
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 4.0 32-Bit Enterprise Edition
  • Microsoft Visual Basic 4.0 Professional Edition
關鍵字:?
kbmt kbapi kbhowto kbhowtomaster kbspooler KB202480 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:202480? (http://support.microsoft.com/kb/202480/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。