你可以用这个API函数 Declare Function AddPrinterConnection Lib "winspool.drv" Alias "AddPrinterConnectionA" (ByVal pName As String) As LongpName为一个网络打印机的名称.返回值的表示: 非0成功. 0失败
'在 .bas 文件中加入以下声明及模组:'Constants Definition Public Const CCHDEVICENAME = 32 Public Const CCHFORMNAME = 32 Public Const PRINTER_ACCESS_ADMINISTER = &H4 Public Const PRINTER_ACCESS_USE = &H8'Types Definition Public 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 Long dmPelsWidth As Long dmPelsHeight As Long dmDisplayFlags As Long dmDisplayFrequency As Long End TypePublic Type PRINTER_DEFAULTS pDatatype As String pDevMode As DEVMODE DesiredAccess As Long End Type'API Declarations Public Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long Public 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 LongPublic Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long '取得指定的打印机,目前有多少 Jobs (最大值为 128) '打印机的名称可以是 mapping 的网络路径名称,例如: "\\myserver\myprinter" Function GetPrinterQueue(PrinterName As String) As Long Dim PrinterStruct As PRINTER_DEFAULTS Dim HPrinter As Long Dim ret As Boolean Dim JobStruct(0 To 127) As Byte Dim pcbNeeded As Long Dim pcReturned As Long Dim TempByte As Byte'设定 Printer structure 初值 PrinterStruct.pDatatype = vbNullString PrinterStruct.pDevMode.dmSize = Len(PrinterStruct.pDevMode) PrinterStruct.DesiredAccess = PRINTER_ACCESS_USE '取得打印机的 Handle ret = OpenPrinter(PrinterName, HPrinter, PrinterStruct) '可在这一处加上判断,,如果取得的句柄为false ' if ret =false then msgbox "连接不正常!" exit sub endif '取得打印机的 active jobs ret = EnumJobs(HPrinter, 0, 127, 1, TempByte, 0, pcbNeeded, pcReturned) If pcbNeeded = 0 Then GetPrinterQueue = 0 Else ret = EnumJobs(HPrinter, 0, 127, 1, JobStruct(0), pcbNeeded, pcbNeeded, pcReturned) GetPrinterQueue = pcReturned End If '关闭打印机 ret = CloseHandle(HPrinter) End Function '在表单中放一个 CommandButton,程序码如下:Private Sub Command1_Click() '测试预设打印机的 Queue (Printer.DeviceName) Msgbox "打印机中尚有 " & GetPrinterQueue(Printer.DeviceName) & " 份报表", 64, "讯息" End Sub
Declare Function AddPrinterConnection Lib "winspool.drv" Alias "AddPrinterConnectionA" (ByVal pName As String) As LongpName为一个网络打印机的名称.返回值的表示:
非0成功.
0失败
此错误有以下的原因和解决方法:
访问的设备没有联机或是根本不存在。
检查设备的电源以及设备和计算机间的连接应正常。如果是要使用网络上的打印机,那么请确保计算机和打印机有逻辑连接,例如, LPT1 连接上网络打印机 ID。
网络连接可能断开。
重新连上网络然后重试该操作。
之前我用AddPrinterConnection 函数试过,我把网络禁用,返回值还是真 GetPrinter 和 OpenPrinter 函数也是一样,不管网络可用不可用,对于的安装的网络打印机,返回值都为真!
直到我使用 FindFirstPrinterChangeNotification 函数时才返回错误!请哪位给点拨一下,谢谢!
希望对你有点启发。
Public Const CCHDEVICENAME = 32
Public Const CCHFORMNAME = 32
Public Const PRINTER_ACCESS_ADMINISTER = &H4
Public Const PRINTER_ACCESS_USE = &H8'Types Definition
Public 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 Long
dmPelsWidth As Long
dmPelsHeight As Long
dmDisplayFlags As Long
dmDisplayFrequency As Long
End TypePublic Type PRINTER_DEFAULTS
pDatatype As String
pDevMode As DEVMODE
DesiredAccess As Long
End Type'API Declarations
Public Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long
Public 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 LongPublic Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long '取得指定的打印机,目前有多少 Jobs (最大值为 128)
'打印机的名称可以是 mapping 的网络路径名称,例如: "\\myserver\myprinter"
Function GetPrinterQueue(PrinterName As String) As Long
Dim PrinterStruct As PRINTER_DEFAULTS
Dim HPrinter As Long
Dim ret As Boolean
Dim JobStruct(0 To 127) As Byte
Dim pcbNeeded As Long
Dim pcReturned As Long
Dim TempByte As Byte'设定 Printer structure 初值
PrinterStruct.pDatatype = vbNullString
PrinterStruct.pDevMode.dmSize = Len(PrinterStruct.pDevMode)
PrinterStruct.DesiredAccess = PRINTER_ACCESS_USE
'取得打印机的 Handle
ret = OpenPrinter(PrinterName, HPrinter, PrinterStruct)
'可在这一处加上判断,,如果取得的句柄为false
'
if ret =false then
msgbox "连接不正常!"
exit sub
endif
'取得打印机的 active jobs
ret = EnumJobs(HPrinter, 0, 127, 1, TempByte, 0, pcbNeeded, pcReturned)
If pcbNeeded = 0 Then
GetPrinterQueue = 0
Else
ret = EnumJobs(HPrinter, 0, 127, 1, JobStruct(0), pcbNeeded, pcbNeeded, pcReturned)
GetPrinterQueue = pcReturned
End If
'关闭打印机
ret = CloseHandle(HPrinter)
End Function '在表单中放一个 CommandButton,程序码如下:Private Sub Command1_Click()
'测试预设打印机的 Queue (Printer.DeviceName)
Msgbox "打印机中尚有 " & GetPrinterQueue(Printer.DeviceName) & " 份报表", 64, "讯息"
End Sub
多谢各位,打印数据我都能获取正确,关键问题是我测试不到打印机是否连接正常!!我还想问一个问题:如果在Win98系统下打印文档,我就不能获得正确的打印页数,是不是Win98操作系统打印信息包里不包含页码信息??