|
0 J/ @6 Z9 e) u7 N3 f5 o
前几天写程序用到几个打印的API函数.把研究成果和大家分享
- j( l8 O# S0 p9 w建议大家结合MSDN看看 + J M, v5 @3 J$ e) Z
Private Type PRINTER_INFO_1 5 m) L4 z% D7 @% F p/ Z+ ?8 P, A4 U
Flags As Long
i/ A8 s0 V; A! F5 i3 f# d pDescription As Long
' y( l7 [( ^8 H4 e' a pName As Long 8 i! R9 k& H% v W2 G! J+ [# Y
pComment As Long / g- A% P" U3 @# [ e
End Type
; N) a' ]( S& e8 |2 v1 S0 FPrivate Declare Function PrinterProperties Lib "winspool.drv" (ByVal hWnd As 5 l. {: ~' P# p: H& P
Long, ByVal hPrinter As Long) As Long
$ A- A* V6 w+ [Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As
3 V# o$ e9 C# B/ |$ V; u, W% RLong) As Long
^+ u0 E1 j0 }Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA"
! K& c" x0 T) w' a(ByVal pPrinterName As String, phPrinter As Long, pDefault As Long) As Long 0 A$ V5 z$ E0 Z1 H
Private Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (
, \! o/ g) n' SByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As
Z! _- \5 }) ~" ELong, pcbNeeded As Long) As Long $ Q; Y/ U4 R* P0 M! D
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" _
% F( |. y* ?7 U3 \# V8 E( }. e (ByVal lpString1 As String, ByVal lpString2 As Long) As Long M3 Z- c3 _0 o8 U+ r, E) t3 T2 P$ Y
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpSt # {2 U* b" F4 n6 C" w
ring As Long) As Long
1 w) S4 H( |- kGetPrinter函数返回的数据即我们想要的数据在参数pPrinter而且是一个地址指针指向
+ i; K" _5 @$ `6 W一个PRINTER_INFO_1结构.结构的pDescription 是指向打印机描述字符串的指针. 0 J5 A, f3 u7 p! i
在VB只好用CopyMemory,lstrcpy 和 lstrlen得到这个字符串.
7 l0 @0 m( z1 g; z下面是 例程:得到打印机的类型名 0 ?; |" `, ?) S( u4 t, s
'pDeviceName是打印机名
. q6 L6 r" P1 z; o3 V'pType 是返回的打印机 Description中的打印机类型.这个串里还有打印机名和驱动程序
' d% [8 Z" r9 ~" u: R6 }Private Sub GetPrint(pDeviceName, pType As String)
0 |# O( l% \4 H E" q% _. X+ Z Dim pIn As PRINTER_INFO_1
1 R9 w8 K5 t! ` g' _/ E$ H Dim s As String * 256
4 M' x. a8 A# ~" R5 ^% B Dim r As Long, phPrinter As Long, r1 As Long
1 q1 \, s/ u3 O# G8 h X9 Q5 C On Error Resume Next 5 I" g1 ^. P' ]( A
r = OpenPrinter(pDeviceName & Chr(0), phPrinter, 0&)
. }! w2 t, A) i9 Q If r = 0 Then Exit Sub
1 {+ ?0 e, P+ U/ @, Z/ z r = GetPrinter(phPrinter, 1, 0, 0, r1)
( `6 J7 m3 I; x* s' U6 X ReDim pPrinter(r1) As Byte 8 F& ]" O. X3 _* r% V+ L4 Z
r = GetPrinter(phPrinter, 1, pPrinter(0), r1, r1) ; U7 a6 ~& m* d
If r = 0 Then Exit Sub
7 ^' v7 e( @8 `8 a2 c! q" d; ~+ C- N r = ClosePrinter(phPrinter)
* \! Q, D5 f1 L7 l CopyMemory pIn, pPrinter(0), Len(pIn)
9 d/ k# N# v7 I* A/ F: i P& ^, @
' k5 R; E* @& C r1 = lstrlen(pIn.pDescription) 6 L7 W: P6 j6 N% M
r = lstrcpy(s, pIn.pDescription)
2 e2 g7 v) F& h5 d0 J9 `3 G If r = 0 Then Exit Sub
! T& e, k5 U a2 N/ w pType = Left(s, r1)
( A' {' C4 o. l/ z G r1 = InStr(1, pType, ",") ( K/ M0 s+ j8 W3 E) y
r = InStr(r1 + 1, pType, ",") ! Q( |; I, E+ D, E* R
pType = Mid(pType, r1 + 1, r - r1 - 1)
# w# J4 g: ~6 Z! |8 J5 |3 zEnd Sub ! J$ q$ S, S/ \
PrinterProperties函数比较简单.你试试吗? |