请高手指点,得到打印机每次打印文档的页数和一些其它基本信息?
麻烦啦!!
麻烦啦!!
解决方案 »
- 根据句柄激活窗体
- 一个sql语句
- 在VB中怎样实现打印功能?我要把数据库中的数据打印出来。
- 怎样实现类似dos中debug的-o 2a8 ff命令?
- 这样创建数据库可以吗?
- VB中关于菜单的两个问题
- 我要在picturebox中随机的画两行或一行text框,怎么办????
- 如何用当前窗体的程序获取另一窗体的程序运行状态?
- 农民的问题:给类型为Char的字段赋值失败!
- 我想用数据库实现就像以下的样子,如何做呢?
- 高手帮忙,请问VB如何修复access 97 或者access 2000或更高版本的数据库,压缩数据库又怎样处理?
- 求教:有一个Form1和模块,在Form1用Public声明的对象在模块中不能用,提示变量未定义,请高手指教。
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
一、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