如果想得到各打印作业的状态,通常我们可以通过调用以下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/library/default.asp?url=/library/en-us/netdir/adsi/iadsprintjoboperations.asp?frame=true 它需要Win2000及以后版本或装了Active Directory Client Extension的WinNT 4.0sp6a/Win95/98/Me来运行。关于Active Directory Client Extension的安装信息,您可以参考以下文档: http://www.microsoft.com/windows2000/server/evaluation/news/bulletins/adextension.asp - 微软亚洲技术中心 VB技术支持 本贴子仅供YESKY的用户作为参考信息使用。其内容不具备任何法律保障。您需要考虑到并承担使用此信息可能带来的风险。VB声明 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 说明 枚举打印队列中的作业 返回值 Long,非零表示成功,零表示失败。会设置GetLastError 参数表 参数 类型及说明 hPrinter Long,一个已打开的打印机对象的句柄(用OpenPrinter获得) FirstJob Long,作业列表中要枚举的第一个作业的索引(注意编号从0开始) NoJobs Long,要枚举的作业数量 Level Long,1或2 pJob Byte,包含 JOB_INFO_1 或 JOB_INFO_2 结构的缓冲区 cbBuf Long,pJob缓冲区中的字符数量 pcbNeeded Long,指向一个Long型变量的指针,该变量用于保存请求的缓冲区长度,或者实际读入的字节数量 pcReturned Long,载入缓冲区的结构数量(用于那些能返回多个结构的函数) VB声明 Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long 说明 打开指定的打印机,并获取打印机的句柄 返回值 Long,非零表示成功,零表示失败。会设置GetLastError 参数表 参数 类型及说明 pPrinterName String,要打开的打印机的名字 phPrinter Long,用于装载打印机的句柄 pDefault PRINTER_DEFAULTS,这个结构保存要载入的打印机信息
JOB_INFO_1 JOB_INFO_2 得到的都只是一些ID啊.没有真正的文件名啊.多谢
用了我2小时的时间,记得要给分,呵呵Private Type PRINTER_DEFAULTS pDatatype As String pDevMode As Long DesiredAccess As Long End TypePrivate Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As LongPrivate Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As LongPrivate 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 LongPrivate 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 TypePrivate Type JOB_INFO_1 JobId As Long pPrinterName As Long pMachineName As Long pUserName As Long pDocument As Long pDatatype As Long pStatus As Long Status As Long Priority As Long Position As Long TotalPages As Long PagesPrinted As Long Submitted As SYSTEMTIME End TypePrivate Const PRINTER_ACCESS_ADMINISTER = &H4Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As LongPrivate Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200Private Sub Command1_Click() Dim hPrinter As Long Dim RetVal As Long Dim pd As PRINTER_DEFAULTS Dim lngCount As Long
你好,感谢你在以前回答我的一个问题,让我学到许多东西 http://expert.csdn.net/Expert/topic/2646/2646636.xml?temp=.3826715 现在再让请教同一问题,就是 Private Function GetStringFromMem(ByVal Addr As Long) As String Dim lngSize As Long Dim bytStr() As Byte Dim lngX As Long
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/library/default.asp?url=/library/en-us/netdir/adsi/iadsprintjoboperations.asp?frame=true
它需要Win2000及以后版本或装了Active Directory Client Extension的WinNT 4.0sp6a/Win95/98/Me来运行。关于Active Directory Client Extension的安装信息,您可以参考以下文档:
http://www.microsoft.com/windows2000/server/evaluation/news/bulletins/adextension.asp
- 微软亚洲技术中心 VB技术支持
本贴子仅供YESKY的用户作为参考信息使用。其内容不具备任何法律保障。您需要考虑到并承担使用此信息可能带来的风险。VB声明
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
说明
枚举打印队列中的作业
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
hPrinter Long,一个已打开的打印机对象的句柄(用OpenPrinter获得)
FirstJob Long,作业列表中要枚举的第一个作业的索引(注意编号从0开始)
NoJobs Long,要枚举的作业数量
Level Long,1或2
pJob Byte,包含 JOB_INFO_1 或 JOB_INFO_2 结构的缓冲区
cbBuf Long,pJob缓冲区中的字符数量
pcbNeeded Long,指向一个Long型变量的指针,该变量用于保存请求的缓冲区长度,或者实际读入的字节数量
pcReturned Long,载入缓冲区的结构数量(用于那些能返回多个结构的函数) VB声明
Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long
说明
打开指定的打印机,并获取打印机的句柄
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
pPrinterName String,要打开的打印机的名字
phPrinter Long,用于装载打印机的句柄
pDefault PRINTER_DEFAULTS,这个结构保存要载入的打印机信息
pDatatype As String
pDevMode As Long
DesiredAccess As Long
End TypePrivate Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As LongPrivate Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As LongPrivate 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 LongPrivate 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 TypePrivate Type JOB_INFO_1
JobId As Long
pPrinterName As Long
pMachineName As Long
pUserName As Long
pDocument As Long
pDatatype As Long
pStatus As Long
Status As Long
Priority As Long
Position As Long
TotalPages As Long
PagesPrinted As Long
Submitted As SYSTEMTIME
End TypePrivate Const PRINTER_ACCESS_ADMINISTER = &H4Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As LongPrivate Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200Private Sub Command1_Click()
Dim hPrinter As Long
Dim RetVal As Long
Dim pd As PRINTER_DEFAULTS
Dim lngCount As Long
Dim JI1() As JOB_INFO_1
Dim aJi1() As Byte
Dim dwBytesNeed As Long
Dim dwBytesRet As Long
Dim lngSize As Long
Dim JI_1 As JOB_INFO_1
lngSize = Len(JI_1)
pd.DesiredAccess = PRINTER_ACCESS_ADMINISTER
RetVal = OpenPrinter(Printer.DeviceName, hPrinter, pd)
ReDim aJi1(lngSize - 1)
RetVal = EnumJobs(hPrinter, 0, 3, 1, aJi1(0), lngSize, dwBytesNeed, dwBytesRet)
If RetVal = 0 And dwBytesNeed = 0 Then
GetAPIError Err.LastDllError
Exit Sub
End If
If dwBytesNeed = 0 Then
MsgBox "没有打印任务!", vbInformation
Exit Sub
End If
If dwBytesNeed > lngSize Then
ReDim aJi1(dwBytesNeed - 1)
RetVal = EnumJobs(hPrinter, 0, 3, 1, aJi1(0), dwBytesNeed, dwBytesNeed, dwBytesRet)
End If
ReDim JI1(1 To dwBytesRet)
List1.Clear
For lngCount = 1 To dwBytesRet
Call CopyMemory(JI1(lngCount), aJi1((lngCount - 1) * lngSize), lngSize)
List1.AddItem "打印任务" & lngCount
List1.AddItem "JobID:" & JI1(lngCount).JobId
List1.AddItem "pPrinterName:" & GetStringFromMem(JI1(lngCount).pPrinterName)
List1.AddItem "pMachineName:" & GetStringFromMem(JI1(lngCount).pMachineName)
List1.AddItem "pUserName:" & GetStringFromMem(JI1(lngCount).pUserName)
List1.AddItem "pDocument:" & GetStringFromMem(JI1(lngCount).pDocument)
List1.AddItem "pStatus:" & JI1(lngCount).pStatus
List1.AddItem "Status:" & JI1(lngCount).Status
List1.AddItem "Priority:" & JI1(lngCount).Priority
List1.AddItem "Position:" & JI1(lngCount).Position
List1.AddItem "TotalPages:" & JI1(lngCount).TotalPages
List1.AddItem "PagesPrinted:" & JI1(lngCount).PagesPrinted
List1.AddItem "Year:" & JI1(lngCount).Submitted.wYear
List1.AddItem "Month:" & JI1(lngCount).Submitted.wMonth
List1.AddItem "Day:" & JI1(lngCount).Submitted.wDay
List1.AddItem "DayOfWeek:" & JI1(lngCount).Submitted.wDayOfWeek
List1.AddItem "Hour:" & JI1(lngCount).Submitted.wHour
List1.AddItem "Minute:" & JI1(lngCount).Submitted.wMinute
List1.AddItem "Second:" & JI1(lngCount).Submitted.wSecond
List1.AddItem "wMilliseconds:" & JI1(lngCount).Submitted.wMilliseconds
Next
ClosePrinter (hPrinter)
End SubPublic Function GetAPIError(ByVal API_ERROR As Long)
Dim Lret As Long
Dim M_Msg As String
M_Msg = String(256, " ")
Lret = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, 0&, API_ERROR, 0&, M_Msg, Len(M_Msg), 0&)
If Lret <> 0 Then
M_Msg = Trim(M_Msg)
MsgBox M_Msg, , "API错误信息"
End If
End Function'从给定的内存地址中获得字符串
Private Function GetStringFromMem(ByVal Addr As Long) As String
Dim lngSize As Long
Dim bytStr() As Byte
Dim lngX As Long
'获得字符串的长度
Call CopyMemory(lngSize, ByVal Addr - 4, 4)
ReDim bytStr(lngSize / 2)
Call CopyMemory(bytStr(0), ByVal Addr, lngSize / 2 + 1)
GetStringFromMem = StrConv(bytStr, vbUnicode)
End Function
http://expert.csdn.net/Expert/topic/2646/2646636.xml?temp=.3826715
现在再让请教同一问题,就是
Private Function GetStringFromMem(ByVal Addr As Long) As String
Dim lngSize As Long
Dim bytStr() As Byte
Dim lngX As Long
'获得字符串的长度
'这在这句里由于是4,所以取的任务栏不全,如果改成5则有的机行,有的机不行多谢
Call CopyMemory(lngSize, ByVal Addr - 4, 4) ReDim bytStr(lngSize / 2)
Call CopyMemory(bytStr(0), ByVal Addr, lngSize / 2 + 1)
GetStringFromMem = StrConv(bytStr, vbUnicode)
End Function