有一台Windows 2003服务器上共享了一台打印机,并且有一些Mac机连接至这台共享的打印机上。由于Mac机的处理较为复杂,并且RIP一份复杂的文件可能需要近两小时,希望直接从共享打印机进行处理,希望达到以下效果,希望熟悉打印机API的朋友帮帮忙,谢谢!
1.获得打印机的任务清单
2.在打印清单上设置打印的份数(因为直接从Spool打印速度会快很多)

解决方案 »

  1.   

    网上流行的一个代码,不知道管不管用
    Option Explicit
    Public Type PRINTER_NOTIFY_INFO_DATA
        Type As Integer
        Field As Integer
        Reserved As Long
        id As Long
        adwData(0 To 1) As Long
    End TypePublic Type PRINTER_NOTIFY_INFO
        dwVersion As Long
        dwFlags As Long
        dwCount As Long
        aData As Long
    End TypePublic Type PRINTER_NOTIFY_OPTIONS_TYPE
        Type As Integer
        Reserved_0 As Integer
        Reserved_1 As Long
        Reserved_2 As Long
        Count As Long
        'pFields() as Integer '\\ Array of 16 bit values,
        pFields As Long
    End TypePublic Type PRINTER_NOTIFY_OPTIONS
        Version As Long 'should be set to 2
        Flags As Long
        Count As Long
        lpPrintNotifyOptions As Long
    End Type
    Public Declare Function FindFirstPrinterChangeNotificationLong Lib "winspool.drv" Alias "FindFirstPrinterChangeNotification" (ByVal hPrinter As Long, ByVal fdwFlags As Long, ByVal fdwOptions As Long, ByVal lpPrinterNotifyOptions As Long) As Long
    Public Declare Function FindNextPrinterChangeNotificationByLong Lib "winspool.drv" Alias "FindNextPrinterChangeNotification" (ByVal hChange As Long, pdwChange As Long, pPrinterOptions As PRINTER_NOTIFY_OPTIONS, ppPrinterNotifyInfo As Long) As LongPublic Enum PrinterChangeNotifications
        PRINTER_CHANGE_ADD_PRINTER = &H1
        PRINTER_CHANGE_SET_PRINTER = &H2
        PRINTER_CHANGE_DELETE_PRINTER = &H4
        PRINTER_CHANGE_FAILED_CONNECTION_PRINTER = &H8
        PRINTER_CHANGE_PRINTER = &HFF
        PRINTER_CHANGE_ADD_JOB = &H100
        PRINTER_CHANGE_SET_JOB = &H200
        PRINTER_CHANGE_DELETE_JOB = &H400
        PRINTER_CHANGE_WRITE_JOB = &H800
        PRINTER_CHANGE_JOB = &HFF00
        PRINTER_CHANGE_ADD_FORM = &H10000
        PRINTER_CHANGE_SET_FORM = &H20000
        PRINTER_CHANGE_DELETE_FORM = &H40000
        PRINTER_CHANGE_FORM = &H70000
        PRINTER_CHANGE_ADD_PORT = &H100000
        PRINTER_CHANGE_CONFIGURE_PORT = &H200000
        PRINTER_CHANGE_DELETE_PORT = &H400000
        PRINTER_CHANGE_PORT = &H700000
        PRINTER_CHANGE_ADD_PRINT_PROCESSOR = &H1000000
        PRINTER_CHANGE_DELETE_PRINT_PROCESSOR = &H4000000
        PRINTER_CHANGE_PRINT_PROCESSOR = &H7000000
        PRINTER_CHANGE_ADD_PRINTER_DRIVER = &H10000000
        PRINTER_CHANGE_SET_PRINTER_DRIVER = &H20000000
        PRINTER_CHANGE_DELETE_PRINTER_DRIVER = &H40000000
        PRINTER_CHANGE_PRINTER_DRIVER = &H70000000
        PRINTER_CHANGE_TIMEOUT = &H80000000
        PRINTER_CHANGE_ALL = &H7777FFFF
    End EnumPublic Enum PrinterChangeNotificationFields
        PRINTER_NOTIFY_FIELD_SERVER_NAME = &H0
        PRINTER_NOTIFY_FIELD_PRINTER_NAME = &H1
        PRINTER_NOTIFY_FIELD_SHARE_NAME = &H2
        PRINTER_NOTIFY_FIELD_PORT_NAME = &H3
        PRINTER_NOTIFY_FIELD_DRIVER_NAME = &H4
        PRINTER_NOTIFY_FIELD_COMMENT = &H5
        PRINTER_NOTIFY_FIELD_LOCATION = &H6
        PRINTER_NOTIFY_FIELD_DEVMODE = &H7
        PRINTER_NOTIFY_FIELD_SEPFILE = &H8
        PRINTER_NOTIFY_FIELD_PRINT_PROCESSOR = &H9
        PRINTER_NOTIFY_FIELD_PARAMETERS = &HA
        PRINTER_NOTIFY_FIELD_DATATYPE = &HB
        PRINTER_NOTIFY_FIELD_SECURITY_DESCRIPTOR = &HC
        PRINTER_NOTIFY_FIELD_ATTRIBUTES = &HD
        PRINTER_NOTIFY_FIELD_PRIORITY = &HE
        PRINTER_NOTIFY_FIELD_DEFAULT_PRIORITY = &HF
        PRINTER_NOTIFY_FIELD_START_TIME = &H10
        PRINTER_NOTIFY_FIELD_UNTIL_TIME = &H11
        PRINTER_NOTIFY_FIELD_STATUS = &H12
        PRINTER_NOTIFY_FIELD_STATUS_STRING = &H13
        PRINTER_NOTIFY_FIELD_CJOBS = &H14
        PRINTER_NOTIFY_FIELD_AVERAGE_PPM = &H15
        PRINTER_NOTIFY_FIELD_TOTAL_PAGES = &H16
        PRINTER_NOTIFY_FIELD_PAGES_PRINTED = &H17
        PRINTER_NOTIFY_FIELD_TOTAL_BYTES = &H18
        PRINTER_NOTIFY_FIELD_BYTES_PRINTED = &H19
        PRINTER_NOTIFY_FIELD_OBJECT_GUID = &H1A
    End EnumPublic Enum JobChangeNotificationFields
        JOB_NOTIFY_FIELD_PRINTER_NAME = &H0
        JOB_NOTIFY_FIELD_MACHINE_NAME = &H1
        JOB_NOTIFY_FIELD_PORT_NAME = &H2
        JOB_NOTIFY_FIELD_USER_NAME = &H3
        JOB_NOTIFY_FIELD_NOTIFY_NAME = &H4
        JOB_NOTIFY_FIELD_DATATYPE = &H5
        JOB_NOTIFY_FIELD_PRINT_PROCESSOR = &H6
        JOB_NOTIFY_FIELD_PARAMETERS = &H7
        JOB_NOTIFY_FIELD_DRIVER_NAME = &H8
        JOB_NOTIFY_FIELD_DEVMODE = &H9
        JOB_NOTIFY_FIELD_STATUS = &HA
        JOB_NOTIFY_FIELD_STATUS_STRING = &HB
        JOB_NOTIFY_FIELD_SECURITY_DESCRIPTOR = &HC
        JOB_NOTIFY_FIELD_DOCUMENT = &HD
        JOB_NOTIFY_FIELD_PRIORITY = &HE
        JOB_NOTIFY_FIELD_POSITION = &HF
        JOB_NOTIFY_FIELD_SUBMITTED = &H10
        JOB_NOTIFY_FIELD_START_TIME = &H11
        JOB_NOTIFY_FIELD_UNTIL_TIME = &H12
        JOB_NOTIFY_FIELD_TIME = &H13
        JOB_NOTIFY_FIELD_TOTAL_PAGES = &H14
        JOB_NOTIFY_FIELD_PAGES_PRINTED = &H15
        JOB_NOTIFY_FIELD_TOTAL_BYTES = &H16
        JOB_NOTIFY_FIELD_BYTES_PRINTED = &H17
    End EnumPublic Enum ChangeNotificationTypes
        PRINTER_NOTIFY_TYPE = &H0
        JOB_NOTIFY_TYPE = &H1
    End Enum
    Public PrintInfoBuffer As PRINTER_NOTIFY_INFO
    Public PrintOptions As PRINTER_NOTIFY_OPTIONS
    Public Const INFO_BUFFER_INITIAL_SIZE = 1000
    Public PrinterNotifyOptions() As PRINTER_NOTIFY_OPTIONS_TYPEPublic Sub RefreshWatchState()    Dim lpPrintInfoBuffer As Long
        
        If mhPrinter <> 0 Then
            If mEventHandle = 0 Then
                mEventHandle = FindFirstPrinterChangeNotificationLong(mhPrinter, PRINTER_CHANGE_ALL, 0, VarPtr(PrintOptions))
            Else
                lpPrintInfoBuffer = VarPtr(PrintInfoBuffer)
                Call FindNextPrinterChangeNotificationByLong(mEventHandle, pdwChange, PrintOptions, lpPrintInfoBuffer)
            End If
        
        End IfEnd Sub
      

  2.   


    Option ExplicitPrivate Sub Command1_Click()
        Class_Initialize
    End Sub'\\ Use
    Private Sub Class_Initialize()    
        '\\ Initialise the PrintInfoBuffer buffer
        With PrintInfoBuffer
            ReDim aData(INFO_BUFFER_INITIAL_SIZE) As PRINTER_NOTIFY_INFO_DATA
            .aData = VarPtr(aData(0))
        End With
        
        '\\ And set the things we want to monitor
        With PrintOptions
            .Version = 2 '\\ for some reason this must be set to 2
            .Count = 2
            '\\ The type of printer events we are interested in...
            With PrinterNotifyOptions(0)
                .Type = PRINTER_NOTIFY_TYPE
                ReDim pFieldsPrinter(0 To 19) As Integer
                '\\ Add the list of printer events you are interested in being notified about
                '\\ to this list. Note that the fewer notifications you ask for the less of a
                '\\ burden your app place upon the system.
                pFieldsPrinter(0) = PRINTER_NOTIFY_FIELD_PRINTER_NAME
                pFieldsPrinter(1) = PRINTER_NOTIFY_FIELD_SHARE_NAME
                pFieldsPrinter(2) = PRINTER_NOTIFY_FIELD_DRIVER_NAME
                pFieldsPrinter(3) = PRINTER_NOTIFY_FIELD_COMMENT
                pFieldsPrinter(4) = PRINTER_NOTIFY_FIELD_LOCATION
                pFieldsPrinter(5) = PRINTER_NOTIFY_FIELD_DEVMODE
                pFieldsPrinter(6) = PRINTER_NOTIFY_FIELD_SEPFILE
                pFieldsPrinter(7) = PRINTER_NOTIFY_FIELD_PRINT_PROCESSOR
                pFieldsPrinter(8) = PRINTER_NOTIFY_FIELD_PARAMETERS
                pFieldsPrinter(9) = PRINTER_NOTIFY_FIELD_DATATYPE
                pFieldsPrinter(10) = PRINTER_NOTIFY_FIELD_SECURITY_DESCRIPTOR
                pFieldsPrinter(11) = PRINTER_NOTIFY_FIELD_ATTRIBUTES
                pFieldsPrinter(12) = PRINTER_NOTIFY_FIELD_PRIORITY
                pFieldsPrinter(13) = PRINTER_NOTIFY_FIELD_DEFAULT_PRIORITY
                pFieldsPrinter(14) = PRINTER_NOTIFY_FIELD_START_TIME
                pFieldsPrinter(15) = PRINTER_NOTIFY_FIELD_UNTIL_TIME
                pFieldsPrinter(16) = PRINTER_NOTIFY_FIELD_STATUS
                pFieldsPrinter(17) = PRINTER_NOTIFY_FIELD_CJOBS
                pFieldsPrinter(18) = PRINTER_NOTIFY_FIELD_AVERAGE_PPM
                pFieldsPrinter(19) = PRINTER_NOTIFY_FIELD_OBJECT_GUID
                .Count = (UBound(pFieldsPrinter) - LBound(pFieldsPrinter)) + 1 '\\ Add one as the array is zero based
                .pFields = VarPtr(pFieldsPrinter(0))
            End With
            '\\ The type of print job events we are interested in...
            With PrinterNotifyOptions(1)
                .Type = JOB_NOTIFY_TYPE
                '\\ Add the list of print job events you are interested in being notified about
                '\\ to this list. Note that the fewer notifications you ask for the less of a
                '\\ burden your app place upon the system.
                ReDim pFieldsJob(0 To 22) As Integer
                pFieldsJob(0) = JOB_NOTIFY_FIELD_PRINTER_NAME
                pFieldsJob(1) = JOB_NOTIFY_FIELD_MACHINE_NAME
                pFieldsJob(2) = JOB_NOTIFY_FIELD_PORT_NAME
                pFieldsJob(3) = JOB_NOTIFY_FIELD_USER_NAME
                pFieldsJob(4) = JOB_NOTIFY_FIELD_NOTIFY_NAME
                pFieldsJob(5) = JOB_NOTIFY_FIELD_DATATYPE
                pFieldsJob(6) = JOB_NOTIFY_FIELD_PRINT_PROCESSOR
                pFieldsJob(7) = JOB_NOTIFY_FIELD_PARAMETERS
                pFieldsJob(8) = JOB_NOTIFY_FIELD_DRIVER_NAME
                pFieldsJob(9) = JOB_NOTIFY_FIELD_DEVMODE
                pFieldsJob(10) = JOB_NOTIFY_FIELD_STATUS
                pFieldsJob(11) = JOB_NOTIFY_FIELD_STATUS_STRING
                pFieldsJob(12) = JOB_NOTIFY_FIELD_DOCUMENT
                pFieldsJob(13) = JOB_NOTIFY_FIELD_PRIORITY
                pFieldsJob(14) = JOB_NOTIFY_FIELD_POSITION
                pFieldsJob(15) = JOB_NOTIFY_FIELD_SUBMITTED
                pFieldsJob(16) = JOB_NOTIFY_FIELD_START_TIME
                pFieldsJob(17) = JOB_NOTIFY_FIELD_UNTIL_TIME
                pFieldsJob(18) = JOB_NOTIFY_FIELD_TIME
                pFieldsJob(19) = JOB_NOTIFY_FIELD_TOTAL_PAGES
                pFieldsJob(20) = JOB_NOTIFY_FIELD_PAGES_PRINTED
                pFieldsJob(21) = JOB_NOTIFY_FIELD_TOTAL_BYTES
                pFieldsJob(22) = JOB_NOTIFY_FIELD_BYTES_PRINTED
                .Count = (UBound(pFieldsJob) - LBound(pFieldsJob)) + 1 '\\ Add one as the array is zero based
                .pFields = VarPtr(pFieldsJob(0))
            End With
            .lpPrintNotifyOptions = VarPtr(PrinterNotifyOptions(0))
        End WithEnd Sub
      

  3.   

    还有人这样说的如果想得到各打印作业的状态,通常我们可以通过调用以下API:
       OpenPrinter
       GetPrinter
       EnumJobs
       ClosePrinter   目前在微软的网站上没有现成的关于以上API调用的VB代码,但有一篇VC的示例代码,您可以参考一下:
    HOWTO: Get the Status of a Printer and a Print Job
    (http://support.microsoft.com/support/kb/articles/Q160/1/29.asp)   另外,您还可以试一下ADSI中的IADsPrintQueueOperations和IADsPrintJobOperations接口。具体信息您可以参考以下文档:
       http://msdn.microsoft.com/librar ... ions.asp?frame=true   它需要Win2000及以后版本或装了Active Directory Client Extension的WinNT 4.0sp6a/Win95/98/Me来运行。