|
) P, \! }6 g7 l1 |, W3 W前几天写程序用到几个打印的API函数.把研究成果和大家分享
: B9 T3 A1 q/ j建议大家结合MSDN看看
" a4 {1 j4 a; jPrivate Type PRINTER_INFO_1 ' \$ W# a) _! g& U0 M, u
Flags As Long ; B* v# ?/ I* n! h0 L9 h2 h9 ~( e8 k$ W
pDescription As Long , N* P3 C$ g( g0 C% E
pName As Long $ U; T& O8 n3 a7 ^! C
pComment As Long
& ]/ V5 |+ h6 `2 z! Z5 N+ A1 o" LEnd Type 9 h! q [) S5 E5 e/ v' E7 ^! K) F
Private Declare Function PrinterProperties Lib "winspool.drv" (ByVal hWnd As
9 X8 R) k5 S, k' jLong, ByVal hPrinter As Long) As Long . x% J/ ~1 e8 C( E o, _
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As 4 X5 {/ b7 v) Y
Long) As Long # l9 q. ~6 K' l8 \$ F+ e
Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" $ K7 `" a' d r8 Q. P4 q
(ByVal pPrinterName As String, phPrinter As Long, pDefault As Long) As Long 8 E9 {+ s3 @$ m2 w
Private Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" ( C$ t O2 `0 Y6 R- G0 C' O$ E
ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As
: e. i9 U; ?* y3 e. `9 r+ cLong, pcbNeeded As Long) As Long ' N" K+ x* b* ~: n& m6 X# k
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" _
$ ~, [4 j4 a- f) f" a/ b% i (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
. _+ V" P1 R! ePrivate Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpSt 7 ~4 w$ `; C0 X3 U
ring As Long) As Long
9 Y3 m% c- Z' d0 b4 l# e7 Z( ~GetPrinter函数返回的数据即我们想要的数据在参数pPrinter而且是一个地址指针指向 9 e' ]6 O6 n+ U0 ~. `' n# f' ^
一个PRINTER_INFO_1结构.结构的pDescription 是指向打印机描述字符串的指针.
( S( }" f8 g7 \' p1 ?1 o3 S: A在VB只好用CopyMemory,lstrcpy 和 lstrlen得到这个字符串.
0 G7 w6 Y1 J* ]) T# j下面是 例程:得到打印机的类型名
- F( ?3 F3 M* ?9 _* W" g! P% V'pDeviceName是打印机名 0 Q" b' J4 J3 J; a8 x
'pType 是返回的打印机 Description中的打印机类型.这个串里还有打印机名和驱动程序 " [9 r4 [ I& ?% \3 O4 A% o: U
Private Sub GetPrint(pDeviceName, pType As String) 4 U) X, v2 l& d9 V( p( v9 k
Dim pIn As PRINTER_INFO_1 5 J- L; X4 C+ Z8 Z' c- w# J
Dim s As String * 256
2 J+ H) v" L9 S& l! J" v Dim r As Long, phPrinter As Long, r1 As Long $ a1 \8 y, ^$ @! c& r9 R2 R- O
On Error Resume Next
' O/ Y; I" ~& D: h r = OpenPrinter(pDeviceName & Chr(0), phPrinter, 0&) 8 ^- {4 E7 u# L; `
If r = 0 Then Exit Sub - l$ I" n8 v+ C) Y7 E
r = GetPrinter(phPrinter, 1, 0, 0, r1) 9 v: o7 b6 x7 O
ReDim pPrinter(r1) As Byte
/ y- n+ z6 X- ?' b2 P8 z* b r = GetPrinter(phPrinter, 1, pPrinter(0), r1, r1)
$ g/ ]% H; Z: w6 N. U If r = 0 Then Exit Sub
9 U' z& X4 i- L. V" H r = ClosePrinter(phPrinter) 0 g0 d$ o8 M& i; J
CopyMemory pIn, pPrinter(0), Len(pIn) + M n7 F+ ?1 Q/ p3 \# b# `) A! ]
7 m* f A, x0 P) |' z r1 = lstrlen(pIn.pDescription)
; [$ I( J, z7 I5 V9 K r = lstrcpy(s, pIn.pDescription)
1 Q0 b- _; f1 n+ U2 p2 e0 g If r = 0 Then Exit Sub
( b+ B. y2 O1 X- @4 p pType = Left(s, r1)
1 o' @: c$ U5 r" v r1 = InStr(1, pType, ",") 8 p# Q* @- X2 I+ Q# {
r = InStr(r1 + 1, pType, ",") % R) U5 _' B2 ~7 k: b0 v# ]
pType = Mid(pType, r1 + 1, r - r1 - 1) 4 i K% z! O9 f0 y
End Sub
) ?8 V- P/ B( ]; D; WPrinterProperties函数比较简单.你试试吗? |