|
$ \6 l) K0 f. Y- \! t前几天写程序用到几个打印的API函数.把研究成果和大家分享
+ r4 f: B1 b9 a) ^$ n# d3 W建议大家结合MSDN看看
2 W7 z& m) g8 `. |- @) x: N9 o3 L* EPrivate Type PRINTER_INFO_1 1 O5 P6 ?4 r6 T9 M: o
Flags As Long
B% T, m9 H' a/ X pDescription As Long + a3 h& t; j- t+ N+ z# d* Z
pName As Long ; Z6 N5 q- }! N. `4 p
pComment As Long * q* Z) S) g: H3 C" U( S, o3 |
End Type
6 ?) ^' F$ B, ]6 @5 ^1 r& X7 j/ q5 XPrivate Declare Function PrinterProperties Lib "winspool.drv" (ByVal hWnd As
! r% d- O! n! w& xLong, ByVal hPrinter As Long) As Long
! B. K7 }! _6 {) Z# A, }4 w7 pPrivate Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As
$ K. W. E1 ]) z& F% t3 hLong) As Long 1 e; I/ a4 ?' t: V; ]: g
Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA"
! D, ~7 F% y% d7 ?, k0 D(ByVal pPrinterName As String, phPrinter As Long, pDefault As Long) As Long
) F* J, u% t0 ?% E* }# W& ~& jPrivate Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" ( - ~3 H5 B4 H) Y: K* w: D6 \6 b
ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As
$ {: h3 ] Z# {: ULong, pcbNeeded As Long) As Long
5 [% @4 I; P: V- b: B0 N M8 ?; JPrivate Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" _
' M9 \1 q& i- [% h8 z; T (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
6 r& `, [3 A5 ?/ kPrivate Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpSt 5 @1 G8 N. f" j6 L. o( R! U
ring As Long) As Long ( R4 n% a/ P7 p$ S( p' p2 C
GetPrinter函数返回的数据即我们想要的数据在参数pPrinter而且是一个地址指针指向
6 H9 J$ n: r$ c: x; L0 T6 w9 v一个PRINTER_INFO_1结构.结构的pDescription 是指向打印机描述字符串的指针.
% M4 y- B: y6 b3 K. e m( h$ b! b8 ~在VB只好用CopyMemory,lstrcpy 和 lstrlen得到这个字符串.
/ f3 _: s0 t, X: ?6 | ?8 J下面是 例程:得到打印机的类型名
6 c; ]% } j1 e% `. e! _'pDeviceName是打印机名
: Y9 I) Z" ]8 Y# i: p# r'pType 是返回的打印机 Description中的打印机类型.这个串里还有打印机名和驱动程序 y% m& y- j9 N
Private Sub GetPrint(pDeviceName, pType As String)
- R _/ V ~( S9 X Dim pIn As PRINTER_INFO_1
) d& }. Z& j$ T* Z; V" l Dim s As String * 256 / f! h Y+ c9 Y4 z/ p) M( v
Dim r As Long, phPrinter As Long, r1 As Long ; T6 R' b" `+ {& T
On Error Resume Next 2 _ U; t# W2 B
r = OpenPrinter(pDeviceName & Chr(0), phPrinter, 0&) ; y! o: t5 W. f* A' R% r
If r = 0 Then Exit Sub
$ F4 P$ E/ P8 u5 G l- b$ y r = GetPrinter(phPrinter, 1, 0, 0, r1)
+ n8 W9 w) Q3 F ReDim pPrinter(r1) As Byte 6 Y) B/ ^9 V% j- e ?
r = GetPrinter(phPrinter, 1, pPrinter(0), r1, r1) ' F0 J# u6 ]5 N( U; a$ N" _) C( w
If r = 0 Then Exit Sub
* ~6 a8 I7 `% p# @ r = ClosePrinter(phPrinter)
& k- i, @- b5 E. @* `) T2 ~ CopyMemory pIn, pPrinter(0), Len(pIn) 7 ^" X3 @0 H5 Z# ^4 b1 a5 o
2 ? s- C: z+ h; x3 k r1 = lstrlen(pIn.pDescription)
- g+ l7 ? ~: @ r0 B# W r = lstrcpy(s, pIn.pDescription) # H, [/ A5 E3 u9 K% Y3 q! H
If r = 0 Then Exit Sub
U: g6 F( S: @" ^ pType = Left(s, r1)
; [0 d' u$ x d9 \* Z2 D8 x8 y r1 = InStr(1, pType, ",")
* Y0 F& h# ]9 k r = InStr(r1 + 1, pType, ",") 8 |; w B% g4 g# d5 h' n& b0 `
pType = Mid(pType, r1 + 1, r - r1 - 1)
; k% N# Z k$ Y4 A# q s0 ~End Sub
X8 l- @& z, p; _( G- j0 XPrinterProperties函数比较简单.你试试吗? |