有一台Windows 2003服务器上共享了一台打印机,并且有一些Mac机连接至这台共享的打印机上。由于Mac机的处理较为复杂,并且RIP一份复杂的文件可能需要近两小时,希望直接从共享打印机进行处理,希望达到以下效果,希望熟悉打印机API的朋友帮帮忙,谢谢!
1.获得打印机的任务清单
2.在打印清单上设置打印的份数(因为直接从Spool打印速度会快很多)
1.获得打印机的任务清单
2.在打印清单上设置打印的份数(因为直接从Spool打印速度会快很多)
解决方案 »
- 能用Hook能获取颜色吗?
- 急请教VBA程序:将文本文件(TXT格式)转化成access表,并将每行的前100个字母按10,20,30,40的固定宽度划分格子
- 请问trim()和trim$(),rtrim()和rtrim$()有区别吗,有的话请详述,谢谢
- 如何让菜单项看不到而不是灰色的。谢谢。
- 如何取出字符窜中某一特定字符之前的子窜!
- VB(Help)
- 如何将VB的标准控件转换为ActiveX控件???
- 把数据添加到文件末尾的方法?(内祥)谢
- 关于EXCEL的问题,请给位高手给于解答!!!!!!!!!!!!!!!!!!!!!
- 一个有关痛痒的ADO控件问题!!!
- 关于text中文本变色的问题
- vb和CB之间传递数据
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
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
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来运行。