如何用代码清空打印机作业里的内容呢?作业不止一个!
有判断打印机状态的代码么?网上有些例子说能够判断打印机的状态!
但是我试过把打印机关了它都没有任何提示!
我把控制面板里面的打印机全部删除后再运行程序也没有提示!
哪位朋友有判断打印机状态的代码大家探讨探讨~~~
谢谢

解决方案 »

  1.   

    Use "SetPrinter" API to clear all jobs of the specific printer
      

  2.   

    http://www.mvps.org/vb/code/PrnInfo.zip
      

  3.   

    http://www.activevb.de/tipps/vb6tipps/tipp0116.html
      

  4.   

    lxcc(虫子|需要点勇气和信心):我看过你以前贴的代码  ' *************************************************************************
    '  Copyright ?001 Karl E. Peterson
    '  All Rights Reserved, http://www.mvps.org/vb
    ' *************************************************************************
    '  You are free to use this code within your own applications, but you
    '  are expressly forbidden from selling or otherwise distributing this
    '  source code, non-compiled, without prior written consent.
    ' *************************************************************************
    Option Explicit' Win32 API declares
    Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrn As Long, pDefault As Any) As Long
    Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrn As Long) As Long
    Private Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As Long, pcbNeeded As Long) As Long'   The data area passed to a system call is too small.
    Private Const ERROR_INSUFFICIENT_BUFFER = 122&' Values used to define DEVMODE structure
    Private Const CCHDEVICENAME As Long = 32
    Private Const CCHFORMNAME As Long = 32Private Type ACL
       AclRevision As Byte
       Sbz1 As Byte
       AclSize As Integer
       AceCount As Integer
       Sbz2 As Integer
    End TypePrivate Type SECURITY_DESCRIPTOR
       Revision As Byte
       Sbz1 As Byte
       Control As Long
       Owner As Long
       Group As Long
       Sacl As ACL
       Dacl As ACL
    End TypePrivate Type DevMode
       dmDeviceName As String * CCHDEVICENAME
       dmSpecVersion As Integer
       dmDriverVersion As Integer
       dmSize As Integer               ' not exposed
       dmDriverExtra As Integer        ' not exposed
       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
       dmNup As Long            ' union with dmDisplayFlags As Long
       dmDisplayFrequency As Long
    End TypePrivate Type PRINTER_INFO_2
       pServerName As String
       pPrinterName As String
       pShareName As String
       pPortName As String
       pDriverName As String
       pComment As String
       pLocation As String
       pDevMode As Long 'DEVMODE
       pSepFile As String
       pPrintProcessor As String
       pDatatype As String
       pParameters As String
       pSecurityDescriptor As Long 'SECURITY_DESCRIPTOR
       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 TypePublic Sub Main()
       Dim prn As Printer
       For Each prn In Printers
          Debug.Print JobCount(prn.DeviceName)
       Next prn
    End SubPublic Function JobCount(ByVal DevName As String) As Long
       Dim hPrn As Long
       Dim BytesNeeded As Long
       Dim BytesUsed As Long
       Dim pi2 As PRINTER_INFO_2
       Const StrSize As Long = 256   ' init string elements
       pi2.pServerName = Space$(StrSize)
       pi2.pPrinterName = Space$(StrSize)
       pi2.pShareName = Space$(StrSize)
       pi2.pPortName = Space$(StrSize)
       pi2.pDriverName = Space$(StrSize)
       pi2.pComment = Space$(StrSize)
       pi2.pLocation = Space$(StrSize)
       pi2.pSepFile = Space$(StrSize)
       pi2.pPrintProcessor = Space$(StrSize)
       pi2.pDatatype = Space$(StrSize)
       pi2.pParameters = Space$(StrSize)   Call OpenPrinter(DevName, hPrn, ByVal 0&)
       If hPrn Then
          If GetPrinter(hPrn, 2, pi2, LenB(pi2), BytesUsed) Then
             JobCount = pi2.cJobs
          Else
             Debug.Print Err.LastDllError
          End If
          Call ClosePrinter(hPrn)
       End If
    End Function怎么我试过无论有没有连打印机,有没有打印作业,打印机是否开机。
    它总是显示122 
              0
    是否我使用不当呢?
    我就是讲你的代码全部粘貼到form中然后调用Main()
      

  5.   

    有没有用PrinterMessageBox判断打印机是否缺纸的例子呢?我找了很久都没有找到!另外,微软网站上的获取打印机状态的例子中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我怎样才能做到当他没有连接打印机的时候出现Off Line状态呢?
    为什么我无论怎样测试,她的状态都是ready?  
      

  6.   

    Sunql(景成):
    If GetPrinter(hPrn, 2, pi2, LenB(pi2), BytesUsed) Then
             JobCount = pi2.cJobs
          Else
             Debug.Print Err.LastDllError
          End If122是Err.LastDllError的错误号
    0是Count数
      

  7.   

    lxcc(虫子|需要点勇气和信心) 
    但是为什么无论如何测试都是122呢?
      

  8.   

    你贴出来的那个原来我贴的,可能在API的调用上有些问题! :$
    你看一下http://www.mvps.org/vb/code/PrnInfo.zip里面的PrnInfo的那个工程里面是如何实现!贴出来的是JobCount工程!
      

  9.   

    要获得打印任务数量JobCount,下面的代码我在win2000下试过了,好用。总显示122是因为调用GetPrinter()时缓冲区参数大小不正确,应该先用GetPrinter()取得缓冲区buffer的大小,然后再调用一次GetPrint()就可以得到打印任务数量等其他信息。至于为什么总是ready,我也不清楚,还请高手帮忙解答。
    Public Function CheckPrinter(PrinterStr As String, JobStr As String) As String
      Dim hPrinter As Long
      Dim result As Long
      Dim pDefaults As PRINTER_DEFAULTS
      Dim ByteBuf As Long
      Dim BytesNeeded As Long
      Dim PrinterInfo() As Byte
      Dim LastError As Long
      Dim PI2 As PRINTER_INFO_2
      
      PrinterName = Printer.DeviceName
      
      pDefaults.DesiredAccess = PRINTER_ACCESS_USE
      
      result = OpenPrinter(PrinterName, hPrinter, pDefaults)
      
      If result = 0 Then
        CheckPrinter = "打开打印机错误! " & PrinterName & ", Error: " & Err.LastDllError
        Exit Function
      End If
      
      Err.Clear
      
      '先取得缓冲区buffer的大小,用以得到打印机信息
      result = GetPrinter(hPrinter, 2, 0&, 0&, BytesNeeded)
      
      ReDim PrinterInfo(1 To BytesNeeded)
      
      ByteBuf = BytesNeeded
      
      result = GetPrinter(hPrinter, 2, PrinterInfo(1), ByteBuf, BytesNeeded)
      
      If result = 0 Then
        LastError = Err.LastDllError()
        
        CheckPrinter = "不能取得打印机状态  Error = " & LastError
        ClosePrinter hPrinter
        Exit Function
      End If
      
      CopyMemory PI2, PrinterInfo(1), Len(PI2)
      
      Label1.Caption = PI2.cJobs    '打印任务数量
      Label2.Caption = GetString(PI2.pPrinterName) '打印机名称
      
    End Function-------------------------------------------------
    Public Const PRINTER_ACCESS_USE = &H8
    Public Const PRINTER_ACCESS_ADMINISTER = &H4Public Type PRINTER_DEFAULTS
       pDatatype As String
       pDevMode As Long
       DesiredAccess As Long
    End TypeType 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 TypePublic Function GetString(ByVal PtrStr As Long) As String
      Dim StrBuffer As String * 256
      
      If PtrStr = 0 Then
        GetString = " "
        Exit Function
      End If
      
      CopyMemory ByVal StrBuffer, ByVal PtrStr, 256
      
      GetString = StripNulls(StrBuffer)
      
    End FunctionPublic Function StripNulls(OriginalStr As String) As String  '去掉空格,取第一个空格以前的字符串 chr(0) = " "
      If (InStr(OriginalStr, Chr(0)) > 0) Then
        OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
      End If
       
      StripNulls = OriginalStr
      
    End Function用GetPinter()对本地打印机,或者连接在局域网上的其它打印机好用,但如果是自带内存的网络打印机就不起作用了。
      

  10.   

    我在www.126.com的邮箱上已发送的文件夹中放了一个可以做到判断打印机状态并打印的程序。但是我单独判断打印机状态可以正常运行,单独打印也可以正常运行,但是两个合起来就报错啦!怎样解决呢?我对API不熟,帮帮忙吧!谢谢
    用户名:YKSEH 密码:456789