请高手指点,得到打印机每次打印文档的页数和一些其它基本信息?
麻烦啦!!

解决方案 »

  1.   

    [名称]           获得某一台网络打印机有几份等待打印的报表[数据来源]       未知[内容简介]       空[源代码内容]当我们要打印报表时,如果打印机是本机的打印机的话,当然马上就会将报表打印出来,反正打印机就只有您一个人在使用而已!但是如果是在一个人数很多的公司或企业时,往往就必须很多人来分享某一部打印机了,而且打印机也不一定就放在举目可及之处!当您将报表丢到网络打印机之后,由于不一定看得到打印机,您必须特别到摆放打印机的地方去拿报表,这时候您最关心的,就是报表印了没有,如果还没有的话,那还有几份还没打印的报表排在您的报表之前呢?下面这一段程序,可以让您知道某一台网络打印机尚有几份等待打印的报表?在您的程序丢出报表的同时,您可以告诉您的 User,他的报表排在第几份!′在 .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 LongPublic 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)
    ′取得打印机的 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
         以上代码保存于: SourceCode Explorer(源代码数据库)
               复制时间: 2005-11-10 17:03:19
               软件版本: 1.0.882
               软件作者: Shawls
                 E-Mail: [email protected]
                     QQ: 9181729
      

  2.   

    用这两个类吧:
    一、CPrinters
    ' *************************************************************************
    '  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 declarations
    Private Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long' Member variables
    Private m_prns As Collection
    Private m_VB5ErrorFlag As Boolean' Exposed events
    Public Event PrinterAdded(ByVal DeviceName As String)' *********************************************
    '  Initialize/Terminate
    ' *********************************************
    Private Sub Class_Initialize()
       ' Initialize member objects
       Me.Refresh
    End SubPrivate Sub Class_Terminate()
       ' Release member objects
       Set m_prns = Nothing
    End Sub' *********************************************
    '  Public Properties (Read-Only)
    ' *********************************************
    Public Property Get Count() As Long
       ' Just return collection size.
       Count = m_prns.Count
    End PropertyPublic Property Get Item(ByVal DevName As String) As CPrinterInfo
       ' Just allow errors to propogate up.
       Set Item = m_prns(DevName)
    End PropertyPublic Property Get PrintersCollectionBad() As Boolean
       ' FIX: Printers Collection May Not Contain All Printers in the Printers Folder
       ' http://support.microsoft.com/support/kb/articles/Q253/6/12.ASP
       ' This property is meaningless *except* under VB5!!!
       PrintersCollectionBad = m_VB5ErrorFlag
    End Property
    ' *********************************************
    '  Public Methods
    ' *********************************************
    Public Function NewEnum() As IUnknown
       ' Support enumeration of Item (default).
       Set NewEnum = m_prns.[_NewEnum]
    End FunctionPublic Sub Refresh()
       Dim Buffer As String
       Dim BufSize As Long
       Dim nChars As Long
       Dim Devices() As String
       Dim inf As CPrinterInfo
       Dim i As Long
       
       ' VB5 fails because it never expands this value!
       ' Start with a reasonably sized buffer.
       BufSize = 512
       
       ' Attempt to get list of installed printers
       ' by looping until successful.
       Do
          Buffer = Space$(BufSize)
          nChars = GetProfileString("PrinterPorts", vbNullString, "", Buffer, BufSize)
          If nChars = (BufSize - 2) Then
             ' MSDN: If either lpAppName or lpKeyName is NULL and
             ' the supplied destination buffer is too small to hold
             ' all the strings, the last string is truncated and
             ' followed by two null characters. In this case, the
             ' return value is equal to nSize minus two.
             BufSize = BufSize * 2
          ElseIf nChars = 0 Then
             ' The call failed entirely.
             Exit Do
          Else
             ' We got a reasonable return.
             Exit Do
          End If
       Loop
       
       ' Build a fresh collection
       Set m_prns = New Collection
       Call ExtractStringZ(Buffer, Devices())
       For i = LBound(Devices) To UBound(Devices)
          Set inf = New CPrinterInfo
          inf.DeviceName = Devices(i)
          m_prns.Add inf, Devices(i)
          RaiseEvent PrinterAdded(Devices(i))
       Next i
       
       ' Set flag to indicate this system will
       ' choke if the Printers collection is
       ' queried from VB5.
       m_VB5ErrorFlag = (nChars > (1024 - 2))
    End Sub' *********************************************
    '  Private Methods
    ' *********************************************
    Private Function ExtractStringZ(Buffer As String, OutArray() As String) As Long
       Dim StartPos As Long
       Dim NullPos As Long
       Dim BuffLen As Long
       Dim Elements As Long
       
       ' Extract null terminated strings from large
       ' double-null terminated buffer.
       StartPos = 1
       Elements = 0
       BuffLen = Len(Buffer)
       
       ' Loop through buffer looking for nulls.
       Do While StartPos < BuffLen
          NullPos = InStr(StartPos, Buffer, vbNullChar)
          If NullPos = StartPos Then
             ' We've hit the double-null terminator.
             Exit Do
          Else
             ' Expand array, store new substring, and
             ' increment counters.
             ReDim Preserve OutArray(0 To Elements) As String
             OutArray(Elements) = Mid$(Buffer, StartPos, NullPos - StartPos)
             StartPos = NullPos + 1
             Elements = Elements + 1
          End If
       Loop
       
       ' Return number of substrings found.
       ExtractStringZ = Elements
    End Function
      

  3.   

    还有3个类,代码太长了,可到我的blog去看:blog.csdn.net/therule,或者搜索以下以前的帖子,前几天我贴过