Αναγν. άρθρου: 202480 - Τελευταία αναθεώρηση: Παρασκευή, 27 Μαΐου 2011 - Αναθεώρηση: 4.0

Τον ΤΡΌΠΟ: Καθορίζουν κατάσταση εκτυπωτή και την κατάσταση της εργασίας εκτύπωσης από τη Visual Basic

Συμβουλή συστήματοςΑυτό το άρθρο ισχύει για διαφορετικό λειτουργικό σύστημα από αυτό που χρησιμοποιείτε. Το περιεχόμενο του άρθρου που ενδέχεται να μην σας αφορά έχει απενεργοποιηθεί.

Σε αυτήν τη σελίδα

Ανάπτυξη όλων | Σύμπτυξη όλων

Περίληψη

Αυτό το άρθρο περιγράφει τον τρόπο χρήσης της εφαρμογής Windows programming interface (API) συναρτήσεις της Visual Basic για να προσδιορίσετε την κατάσταση του εκτυπωτή ή την κατάσταση της εργασίας εκτύπωσης μέσω προγραμματισμού. Παρόλο που μια εφαρμογή δεν έχει συνήθως για να ελέγξετε την κατάσταση του εκτυπωτή πριν από την εκτύπωση, ίσως είναι χρήσιμο για να προσδιορίσετε την κατάσταση του εκτυπωτή ή εργασία εκτύπωσης μέσω προγραμματισμού.

Περιγραφή της τεχνικής

Ο όρος "εκτυπωτής" μπορεί να αναφέρεται σε μια συσκευή υλικού, μια ουρά, ένα πρόγραμμα οδήγησης ή ακόμα και μια θύρα. Σε αυτό το άρθρο, ο όρος "εκτυπωτής" ορίζεται ως τοπική ουρά εκτύπωσης. Το δείγμα κώδικα σε αυτό το άρθρο επιστρέφει τις καταστάσεις που αναφέρει το λειτουργικό σύστημα. Αυτή είναι η ίδια κατάσταση που αναφέρει την ουρά, που μπορείτε να ελέγξετε, να παρακολουθείτε την τοπική ουρά εκτύπωσης.

Για παράδειγμα, για να προβάλετε την ουρά σε έναν υπολογιστή που εκτελεί Microsoft Windows 98, κάντε κλικ στο κουμπί Έναρξη, έπειτα στην επιλογή Ρυθμίσεις, κάντε κλικ στο κουμπί Εκτυπωτές, και στη συνέχεια κάντε διπλό κλικ στο εικονίδιο εκτυπωτή του οποίου η ουρά που θέλετε να προβάλετε.

ΣΗΜΕΊΩΣΗ: Δεν είναι δυνατό να επικοινωνείτε απευθείας με φυσικό εκτυπωτή. Δεν πρέπει να το κάνετε αυτό, επειδή το λειτουργικό σύστημα πρέπει να arbitrate πρόσβαση στο υλικό.

Το δείγμα κώδικα σε αυτό το άρθρο εξετάζει τοπικής ουράς εκτύπωσης, ο οποίος λαμβάνει πληροφορίες από την εποπτεία θύρας, η οποία με τη σειρά του επικοινωνεί με τη φυσική συσκευή. Για πιο λεπτομερή περιγραφή του τρόπου λειτουργίας, ανατρέξτε στα άρθρα που αναγράφονται στην ενότητα "Αναφορές" αυτού του άρθρου.

Αυτό το δείγμα αναφέρει την κατάσταση από τον εκτυπωτή και από τις εργασίες, αλλά Σημειώστε ότι οι πληροφορίες κατάστασης για την εργασία είναι γενικά πιο αξιόπιστη για εφαρμογές. Ιδανικά, πρέπει να εξετάσετε τις εργασίες και τις καταστάσεις εκτυπωτή ξεχωριστά και ο κωδικός πρέπει να συμπεράνει κατάσταση "meta" της ουράς. Ωστόσο, για τις περισσότερες χρήσεις, ο κώδικάς σας να βασιστείτε σε καταστάσεις εργασία. Επίσης, αυτό το παράδειγμα διέρχεται από τις εργασίες και να ελέγχει και αναφέρει την κατάσταση κάθε εργασία. Αυτό συμβαίνει επειδή η εργασία σας μπορεί να ακολουθήστε άλλη εργασία που αναφέρει ένα πρόβλημα, όπως της χαρτί ή λήψη εμπλοκή.

ΣΗΜΕΊΩΣΗ: Το σύστημα ελέγχει μόνο την κατάσταση, όταν το σύστημα εργασίας σε ουρά. Διαφορετικά, η ουρά θεωρείται "έτοιμο" επειδή η ουρά δέχεται εργασιών, ακόμα και αν το υλικό είναι σε κατάσταση σφάλματος. Για παράδειγμα, εάν η τελευταία εργασία που εκτυπώθηκε το τελευταίο κομμάτι χαρτί, το λειτουργικό σύστημα δεν γνωρίζει αυτό μέχρι να προσπαθήσει το σύστημα να εκτυπώσετε ξανά.

Επιπλέον, αν και υπάρχουν πολλές καταστάσεις που μπορεί να αναφερθεί, πολλές δεν υποστηρίζονται στην πράξη. Το υλικό του εκτυπωτή και εποπτείας θύρας καθορίζουν ποιες καταστάσεις έκθεση. Για παράδειγμα, εάν ο εκτυπωτής έχει χαρτί και χωρίς σύνδεση, η κατάσταση μπορεί να αναφέρεται ως "Εκτύπωση" επειδή τι η εργασία προσπαθεί να το κάνετε. Επομένως, μια ουρά που εμφανίζει "Έτοιμο" δεν εγγυάται ότι η εργασία εκτύπωσης θα ολοκληρωθεί με επιτυχία.

Αυτό το δείγμα κώδικα εξετάζει μόνο τοπική ουρά, που θα πρέπει να αρκεί για τις περισσότερες εφαρμογές. Ωστόσο, η σύνδεση σε απομακρυσμένους εκτυπωτές μπορούν να γίνουν αρκετά πολύπλοκη. Να έχετε συνδεδεμένες ουρές, θύρα για τοπική ουρά είναι στην πραγματικότητα άλλη ουρά. Μπορείτε να έχετε από ομάδα εκτυπωτών, στο οποίο λειτουργούν από κοινού super ουρά πολλαπλών εκτυπωτών. Όταν η αρχιτεκτονική γίνεται πιο περίπλοκη, τον κωδικό για την ανάκτηση νόημα κατάσταση γίνεται πιο περίπλοκη και μειώνεται η χρησιμότητα της κατάστασης.

Στο Microsoft Windows 95, Microsoft Windows 98 και Microsoft Windows Millennium Edition μόνο, μπορείτε επίσης να εξετάσετε το PrinterInfo.Attributes το πεδίο bit PRINTER_ATTRIBUTE_WORK_OFFLINE. Η κατάσταση αυτή είναι κάτι που συνήθως προκύπτει εξαιτίας ενέργεια του χρήστη (για παράδειγμα, εάν ο χρήστης κάνει δεξιό κλικ στο εικονίδιο του εκτυπωτή και στη συνέχεια κάνει κλικ Εργασία χωρίς σύνδεση). Αυτή η κατάσταση δεν παρουσιάζεται εξαιτίας της αλλαγής κατάστασης μιας εργασίας εκτύπωσης, παρόλο που το λειτουργικό σύστημα να επιβάλετε κράτος, εάν δεν είναι συνδεδεμένος ο εκτυπωτής να despool μια εργασία. Στην περίπτωση αυτή, η κατάσταση συνήθως αναφέρεται ως USER_INERVENTION_REQUIRED.

Παράδειγμα βήμα προς βήμα

  1. Δημιουργήστε ένα νέο έργο Standard 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. Προσθήκη τρία CommandButton τα στοιχεία ελέγχου.
  4. Προσθήκη τρία Πλαίσιο κειμένου ελέγχει Form1 και στη συνέχεια ρυθμίστε την Πλαίσιο κειμένου ελέγχει ως εξής:
    1. Ορισμός του Πολλών γραμμών η ιδιότητα κάθε Πλαίσιο κειμένου Έλεγχος για TRUE.
    2. Μέγεθος κάθε Πλαίσιο κειμένου περίπου πέντε ιντσών και τρεις ίντσες.
    3. Ορισμός του Γραμμές κύλισης η ιδιότητα κάθε Πλαίσιο κειμένου Έλεγχος για 2 - Κατακόρυφα.
  5. Προσθέστε ένα Χρονόμετρο Έλεγχος 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/ ) ΔΙΑΔΙΚΑΣΙΕΣ: Λήψη της κατάστασης ενός εκτυπωτή και μια εργασία εκτύπωσης
Για πρόσθετες πληροφορίες σχετικά με τον τρόπο χρήσης της συνάρτησης 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/ ) ΔΙΑΔΙΚΑΣΙΕΣ: Ανάκτηση πληροφοριών εργασίας εκτύπωσης
158828  (http://support.microsoft.com/kb/158828/EN-US/ ) ΔΙΑΔΙΚΑΣΙΕΣ: Τρόπος κλήσης Win32 API απαρίθμησης ουράς σωστά

Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 4.0 Standard Edition
Λέξεις-κλειδιά: 
kbapi kbhowto kbhowtomaster kbspooler kbmt KB202480 KbMtel
Μηχανικά μεταφρασμένοΜηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:202480  (http://support.microsoft.com/kb/202480/en-us/ )