请问哪个API函数可以用来测试打印机是否连接正常??比如:打印机未开机或网络不通时返回FALSE
      网络和打印机均正常,即可以正常打印时返回TRUE

解决方案 »

  1.   

    你可以用这个API函数
    Declare Function AddPrinterConnection Lib "winspool.drv" Alias "AddPrinterConnectionA" (ByVal pName As String) As LongpName为一个网络打印机的名称.返回值的表示:
    非0成功.
    0失败
      

  2.   

    设备不可用(错误 68)
    此错误有以下的原因和解决方法: 
    访问的设备没有联机或是根本不存在。 
    检查设备的电源以及设备和计算机间的连接应正常。如果是要使用网络上的打印机,那么请确保计算机和打印机有逻辑连接,例如, LPT1 连接上网络打印机 ID。
    网络连接可能断开。 
    重新连上网络然后重试该操作。
      

  3.   


    之前我用AddPrinterConnection 函数试过,我把网络禁用,返回值还是真 GetPrinter 和 OpenPrinter 函数也是一样,不管网络可用不可用,对于的安装的网络打印机,返回值都为真!
      

  4.   

    以上这些函数是不是根本不测试网络和打印机是否连接正常,只是读取本地的一些信息?
    直到我使用 FindFirstPrinterChangeNotification 函数时才返回错误!请哪位给点拨一下,谢谢!
      

  5.   

    http://www.hostultra.com/~luckynet/programming/visualbasic/vbapi/EnumPrinters.htm
    希望对你有点启发。
      

  6.   

    http://vbeden.xg88.com/preblem/61-80/pr62.htm
      

  7.   

    '在 .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
      

  8.   


    多谢各位,打印数据我都能获取正确,关键问题是我测试不到打印机是否连接正常!!我还想问一个问题:如果在Win98系统下打印文档,我就不能获得正确的打印页数,是不是Win98操作系统打印信息包里不包含页码信息??