如何用代码清空打印机作业里的内容呢?作业不止一个!
有判断打印机状态的代码么?网上有些例子说能够判断打印机的状态!
但是我试过把打印机关了它都没有任何提示!
我把控制面板里面的打印机全部删除后再运行程序也没有提示!
哪位朋友有判断打印机状态的代码大家探讨探讨~~~
谢谢
有判断打印机状态的代码么?网上有些例子说能够判断打印机的状态!
但是我试过把打印机关了它都没有任何提示!
我把控制面板里面的打印机全部删除后再运行程序也没有提示!
哪位朋友有判断打印机状态的代码大家探讨探讨~~~
谢谢
' 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()
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?
If GetPrinter(hPrn, 2, pi2, LenB(pi2), BytesUsed) Then
JobCount = pi2.cJobs
Else
Debug.Print Err.LastDllError
End If122是Err.LastDllError的错误号
0是Count数
但是为什么无论如何测试都是122呢?
你看一下http://www.mvps.org/vb/code/PrnInfo.zip里面的PrnInfo的那个工程里面是如何实现!贴出来的是JobCount工程!
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()对本地打印机,或者连接在局域网上的其它打印机好用,但如果是自带内存的网络打印机就不起作用了。
用户名:YKSEH 密码:456789