|
, R" c4 E6 n6 {# ^
前几天写程序用到几个打印的API函数.把研究成果和大家分享 5 N, V0 l3 b; |$ s( w/ S" _
建议大家结合MSDN看看
" l1 A3 B6 G7 s/ H Z' [Private Type PRINTER_INFO_1 3 K( E8 F- D% U; e
Flags As Long 3 K5 a; _3 f, O2 q! h+ |
pDescription As Long / Y+ e% K% x/ T* j, k. }0 q
pName As Long 8 J5 M! h2 D$ ^/ v6 O) C# g# n
pComment As Long
" M% j- O$ d& g& Y& L; z7 lEnd Type 9 T% f, V& v' V5 y5 Q
Private Declare Function PrinterProperties Lib "winspool.drv" (ByVal hWnd As ( G$ X& y& l5 q' C; Q
Long, ByVal hPrinter As Long) As Long
6 \4 s7 }# u4 m' A0 b- APrivate Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As
0 b7 a) x% o# c9 N$ G# vLong) As Long
p7 s5 U# q! V0 h4 q) s) iPrivate Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA"
; |2 y) {( S1 [' K/ @6 o5 o(ByVal pPrinterName As String, phPrinter As Long, pDefault As Long) As Long 6 y1 _# ]' y" T
Private Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (
+ x: n4 R% D# L+ j9 TByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As
5 w& Y4 ^7 a0 K- @3 z5 ^Long, pcbNeeded As Long) As Long
6 q7 \' N1 ~" t0 Y5 BPrivate Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" _ " Z, }( Y6 _# E" W
(ByVal lpString1 As String, ByVal lpString2 As Long) As Long
/ M* N5 t1 v8 [" C3 ~' n" O7 sPrivate Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpSt + L7 Z3 {, ~$ v5 n$ n1 v5 I( O
ring As Long) As Long
+ J2 |, n6 J9 \4 y- l$ q2 MGetPrinter函数返回的数据即我们想要的数据在参数pPrinter而且是一个地址指针指向
5 y) i& w% P% n3 v5 \一个PRINTER_INFO_1结构.结构的pDescription 是指向打印机描述字符串的指针.
% ?8 u3 A0 D' p# j; o8 l在VB只好用CopyMemory,lstrcpy 和 lstrlen得到这个字符串. , M6 v1 |! h6 n$ {4 ]+ w* p
下面是 例程:得到打印机的类型名 3 l* P7 e {/ r$ B+ k( R- v9 W- Q
'pDeviceName是打印机名 5 n' x7 t2 @4 }& [& g
'pType 是返回的打印机 Description中的打印机类型.这个串里还有打印机名和驱动程序 2 g# ~6 j; z, c, v; i1 q9 ^
Private Sub GetPrint(pDeviceName, pType As String) ' r0 l! t6 ]$ L) q' T8 @& _: L7 m7 Q
Dim pIn As PRINTER_INFO_1
- y8 H6 G. N3 ?8 x4 ^+ o Dim s As String * 256
) H, v" R; I5 y Dim r As Long, phPrinter As Long, r1 As Long $ Z+ @7 S6 D q6 y* u
On Error Resume Next 6 H- g, A# g% g" w6 L
r = OpenPrinter(pDeviceName & Chr(0), phPrinter, 0&) 0 I% W2 U; u, K8 X, \1 K3 }% x
If r = 0 Then Exit Sub
( ^6 l' l' d4 o4 K6 W( L5 t# E r = GetPrinter(phPrinter, 1, 0, 0, r1)
+ g3 ]* L7 S3 p% y ReDim pPrinter(r1) As Byte 1 R, r, k- c( Q- V
r = GetPrinter(phPrinter, 1, pPrinter(0), r1, r1)
) B5 B. \" t+ U7 `( J- c If r = 0 Then Exit Sub , { q( d3 C4 e$ `5 {
r = ClosePrinter(phPrinter) - g2 F8 a( {% c+ u) L$ I
CopyMemory pIn, pPrinter(0), Len(pIn) / r8 J7 s& n+ Y( y7 X+ k' Z2 o
- A4 T, i3 j) g: _
r1 = lstrlen(pIn.pDescription) 0 S/ K, \, F8 C0 s
r = lstrcpy(s, pIn.pDescription)
% {8 O+ y. a7 ^9 C% s, G If r = 0 Then Exit Sub
; i, ^2 u; V/ |% G, f" m# Q' d; e; F pType = Left(s, r1)
" I0 X* g0 c2 | r1 = InStr(1, pType, ",") * @! Y) R) W9 _4 D8 `
r = InStr(r1 + 1, pType, ",") ! N n1 `4 p- d' l7 W
pType = Mid(pType, r1 + 1, r - r1 - 1)
) X. j. Y5 b4 @& ^. LEnd Sub / f- B* m' W" f7 X7 o! [' y/ Z% x
PrinterProperties函数比较简单.你试试吗? |