怎样获取打印机的当前状态(联机、暂停、缺纸等),怎样将打印失败的任务转移到其它打印机上?

解决方案 »

  1.   

    http://support.microsoft.com/kb/202480
    据说可以,还没试呢。
      

  2.   

    系統打印機設置01>設置默認打印机
       描述:在計算机上設置默認打印机。需要Windows XP或Windows Server 2003。
       代碼:
       strComputer = "."
       Set objWMIService = GetObject("winmgmts:" _
           & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
       Set colInstalledPrinters =  objWMIService.ExecQuery _
           ("Select * from Win32_Printer Where Name='ScriptedPrinter'")
       For Each objPrinter in  colInstalledPrinters
           objPrinter.SetDefaultPrinter
       Next02>根据隊列長度設置默認打印机
       描述:檢驗計算机上的所有打印隊列,并且將默認打印机設置為包含最少文檔的隊列。
       代碼: 
       intSmallestQueue = 1000
       strComputer = "."
       Set objWMIService = GetObject("winmgmts:" _
       & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
       Set colPrintQueues = objWMIService.ExecQuery_("Select * from Win32_PerfFormattedData_Spooler_PrintQueue" _
           & "Where Name <> '_Total'")
       For Each objPrintQueue In colPrintQueues
           intCurrentQueue = objPrintQueue.Jobs + objPrintQueue.JobsSpooling
           If intCurrentQueue <= intSmallestQueue Then
              strNewDefault = objPrintQueue.Name
              intSmallestQueue = intCurrentQueue
           End If
       Next
       Set colInstalledPrinters = objWMIService.ExecQuery _
           ("Select * from Win32_Printer Where Name =  '" & strNewDefault & "'")
       For Each objPrinter In colInstalledPrinters
           Call objPrinter.SetDefaultPrinter
       Next03>將打印作業發送到不同的打印隊列
       描述:更改邏輯打印机的 TCP/IP 打印机端口,其結果是將現有的打印作業轉換到新的打印机端口
            (因而轉換到不同的打印机)。需要Windows XP或Windows Server 2003。
       代碼:
       strComputer = "."
       Set objWMIService = GetObject("winmgmts:" _
           & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
       Set objPrinter = objWMIService.Get _
           ("Win32_Printer.DeviceID='ArtDepartmentPrinter'")
       objPrinter.PortName = "IP_192.168.1.10"
       objPrinter.Put_04>當打印机停止時獲得通知
       描述:檢查計算机上每台打印机的狀態,如果這些打印机中有任何一台已經停止,就發出警報。
       代碼:
       strComputer = "."
       Set objWMIService = GetObject("winmgmts:" _
           & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
       Set colInstalledPrinters = objWMIService.ExecQuery _
           ("Select * from Win32_Printer Where PrinterStatus = '1' " _
            & "or PrinterStatus = '2'")
       If colInstalledPrinters.Count = 0 Then
          Wscript.Echo "All printers are functioning correctly."
       Else
          For Each objprinter In colInstalledPrinters
              Wscript.Echo "Printer " & objprinter.Name & " is not responding."
          Next
       End If05>清除打印隊列
       描述:刪除名為HP QuietJet的打印机上的所有打印作業。
       代碼:
       strComputer = "."
       Set objWMIService = GetObject("winmgmts:" _
           & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
       Set colInstalledPrinters = objWMIService.ExecQuery("Select * from Win32_Printer Where Name='HPQuietJet'")
       For Each objPrinter In colInstalledPrinters
           objPrinter.CancelAllJobs
       Next06>監視打印服務
       描述:返回Spooler服務的狀態(正在運行、已停止、已暫停等等)。
       代碼:
       strComputer = "."
       Set objWMIService = GetObject("winmgmts:" _
           & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
       Set colRunningServices =  objWMIService.ExecQuery _
           ("Select * from Win32_Service Where Name = 'Spooler'")
       For Each objService in colRunningServices 
           Wscript.Echo objService.DisplayName  & VbTab & objService.State
       Next
      

  3.   


    Private Const CCHDEVICENAME = 32
    Private Const CCHFORMNAME = 32
    Private 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
        dmUnusedPadding As Integer
        dmBitsPerPel As Integer
        dmPelsWidth As Long
        dmPelsHeight As Long
        dmDisplayFlags As Long
        dmDisplayFrequency As Long
    End Type
    Private 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
       pSepFile As String
       pPrintProcessor As String
       pDatatype As String
       pParameters As String
       pSecurityDescriptor As Long
       Attributes As Long
       Priority As Long
       DefaultPriority As Long
       StartTime As Long
       UntilTime As Long
       Status As Long
       JobsCount As Long
       AveragePPM As Long
    End Type
    Private Type PRINTER_DEFAULTS
      pDatatype As String
      pDevMode As DEVMODE
      DesiredAccess As Long
    End Type
    Public Enum Printer_Status
       PRINTER_STATUS_READY = &H0
       PRINTER_STATUS_PAUSED = &H1
       PRINTER_STATUS_ERROR = &H2
       PRINTER_STATUS_PENDING_DELETION = &H4
       PRINTER_STATUS_PAPER_JAM = &H8
       PRINTER_STATUS_PAPER_OUT = &H10
       PRINTER_STATUS_MANUAL_FEED = &H20
       PRINTER_STATUS_PAPER_PROBLEM = &H40
       PRINTER_STATUS_OFFLINE = &H80
       PRINTER_STATUS_IO_ACTIVE = &H100
       PRINTER_STATUS_BUSY = &H200
       PRINTER_STATUS_PRINTING = &H400
       PRINTER_STATUS_OUTPUT_BIN_FULL = &H800
       PRINTER_STATUS_NOT_AVAILABLE = &H1000
       PRINTER_STATUS_WAITING = &H2000
       PRINTER_STATUS_PROCESSING = &H4000
       PRINTER_STATUS_INITIALIZING = &H8000
       PRINTER_STATUS_WARMING_UP = &H10000
       PRINTER_STATUS_TONER_LOW = &H20000
       PRINTER_STATUS_NO_TONER = &H40000
       PRINTER_STATUS_PAGE_PUNT = &H80000
       PRINTER_STATUS_USER_INTERVENTION = &H100000
       PRINTER_STATUS_OUT_OF_MEMORY = &H200000
       PRINTER_STATUS_DOOR_OPEN = &H400000
       PRINTER_STATUS_SERVER_UNKNOWN = &H800000
       PRINTER_STATUS_POWER_SAVE = &H1000000
    End Enum
    Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long
    Private Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, buffer As Long, ByVal pbSize As Long, pbSizeNeeded As Long) As Long
    Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Private Declare Function IsBadStringPtrByLong Lib "kernel32" Alias "IsBadStringPtrA" (ByVal lpsz As Long, ByVal ucchMax As Long) As Long
    Public Function StringFromPointer(lpString As Long, lMaxLength As Long) As String
        Dim sRet As String
        Dim lret As Long
        If lpString = 0 Then
            StringFromPointer = ""
            Exit Function
        End If
        If IsBadStringPtrByLong(lpString, lMaxLength) Then
            ' An error has occured - do not attempt to use this pointer
            StringFromPointer = ""
            Exit Function
        End If
        ' Pre-initialise the return string...
        sRet = Space$(lMaxLength)
        CopyMemory ByVal sRet, ByVal lpString, ByVal Len(sRet)
        If Err.LastDllError = 0 Then
            If InStr(sRet, Chr$(0)) > 0 Then
                sRet = Left$(sRet, InStr(sRet, Chr$(0)) - 1)
            End If
        End If
        StringFromPointer = sRet
    End Function
    Private Sub Form_Load()
        Dim SizeNeeded As Long, buffer() As Long
        Dim pDef As PRINTER_DEFAULTS
        'Get a handle to the printer
        lret = OpenPrinter(Printer.DeviceName, mhPrinter, pDef)
        'Initialize the buffer
        ReDim Preserve buffer(0 To 0) As Long
        'Retrieve the required size (in bytes)
        lret = GetPrinter(mhPrinter, 2, buffer(0), UBound(buffer), SizeNeeded)
        'Resize the buffer... Note that a Long is four bytes
        ReDim Preserve buffer(0 To (SizeNeeded / 4) + 3) As Long
        'Retrieve the Printer information
        lret = GetPrinter(mhPrinter, 2, buffer(0), UBound(buffer) * 4, SizeNeeded)
        'The data stored in 'buffer' corresponds with the data of a PRINTER_INFO_2 structure
        ClosePrinter mhPrinter
        'Show the data
        PrintData "Server name", StringFromPointer(buffer(0), 255)
        PrintData "Printer name", StringFromPointer(buffer(1), 255)
        PrintData "Share name", StringFromPointer(buffer(2), 255)
        PrintData "Port name", StringFromPointer(buffer(3), 255)
        PrintData "Driver name", StringFromPointer(buffer(4), 255)
        PrintData "Comment", StringFromPointer(buffer(5), 255)
        PrintData "Location", StringFromPointer(buffer(6), 255)
        Unload Me
    End Sub
    Sub PrintData(Name As String, Data As String)
        If LenB(Data) > 0 Then
            Debug.Print Name + ": " + Data
        End If
    End Sub
      

  4.   

    新手向大家学习,看了zsj1101(江南神探) 的回复,感觉头已经晕了
      

  5.   

    firebow3007()  上面的代码只是获取当前打印机的名称及端口,离题目问题还有一些差距,请你继续发表,最好能解决问题!