|
3 _& y, _6 B; k
前几天写程序用到几个打印的API函数.把研究成果和大家分享
" R( c- \. ?0 ?) q建议大家结合MSDN看看 / o5 W/ V. m5 E/ ^- e" s, H* ~+ B4 A; F
Private Type PRINTER_INFO_1 0 E4 T9 ]( O# J: `2 H1 `3 L
Flags As Long / n! h; p7 n5 l! g* a
pDescription As Long
* A' [: r4 f% S9 h3 }. I pName As Long / a, u- x: {: Q: r0 R: w- b& h
pComment As Long ; t. J A0 ] M! U! ~) n0 d
End Type & ]1 J: ~0 S5 e- e
Private Declare Function PrinterProperties Lib "winspool.drv" (ByVal hWnd As
& Q; _# P8 _# J- ~: N# mLong, ByVal hPrinter As Long) As Long & r# E3 a {9 G6 |* [2 @ q" n
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As
6 J. p( @. U, i' X9 ALong) As Long
$ Z$ {2 e: E% U6 E1 qPrivate Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" : v& E# S$ X' k1 u" u, H8 z
(ByVal pPrinterName As String, phPrinter As Long, pDefault As Long) As Long
5 m% {4 X# C( j. x5 W0 MPrivate Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" ( * U2 h7 [3 W' x4 p2 }! B9 M8 h( h9 }" M
ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As
$ W* V {, p7 C1 t. t, BLong, pcbNeeded As Long) As Long
( Z. ~* }" P1 F1 d+ PPrivate Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" _
: ]# {8 _- s8 u; {: D (ByVal lpString1 As String, ByVal lpString2 As Long) As Long 8 I' K# Q+ A! O _% k& j& n( C
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpSt
u8 n. Q8 @. g3 e' j, Nring As Long) As Long 7 @6 }& p2 ]3 a" l) s; J( G
GetPrinter函数返回的数据即我们想要的数据在参数pPrinter而且是一个地址指针指向 , G7 O, c# t9 z" k
一个PRINTER_INFO_1结构.结构的pDescription 是指向打印机描述字符串的指针.
1 e3 I! p5 ]0 _" Z, _2 w9 o在VB只好用CopyMemory,lstrcpy 和 lstrlen得到这个字符串.
. P% w) q+ Q7 u$ U: W" V6 z! B下面是 例程:得到打印机的类型名
( g# h( Y7 B/ |8 C'pDeviceName是打印机名 $ B; U0 W3 K) A: M1 Z
'pType 是返回的打印机 Description中的打印机类型.这个串里还有打印机名和驱动程序 ( d5 b( K5 J' g- Z
Private Sub GetPrint(pDeviceName, pType As String) " ` D! O Z0 Q2 x. X- h' i
Dim pIn As PRINTER_INFO_1
( D+ v7 j+ @( m$ Y1 t/ q# ^ @$ s Dim s As String * 256
5 F/ z8 O* t& N J Dim r As Long, phPrinter As Long, r1 As Long
' Z7 f4 i, }) d: C On Error Resume Next
+ V$ y3 J4 A- G) Y r = OpenPrinter(pDeviceName & Chr(0), phPrinter, 0&) $ k9 j$ ]5 t7 |% Z8 ]& F
If r = 0 Then Exit Sub
9 b' M: t- }# F; N r = GetPrinter(phPrinter, 1, 0, 0, r1) 4 [9 z+ }+ w5 D$ s3 R2 T4 [
ReDim pPrinter(r1) As Byte & d; T8 H2 m: b( |9 h- K" M
r = GetPrinter(phPrinter, 1, pPrinter(0), r1, r1) $ ? K" C/ }+ b; \" b" ~' W1 V7 b
If r = 0 Then Exit Sub & A% G/ K/ n; D7 T
r = ClosePrinter(phPrinter)
: Z! N8 S. d2 \ CopyMemory pIn, pPrinter(0), Len(pIn) + G$ K5 _: b9 _6 R. e
( Y) O: P' k1 S$ A5 [* j r1 = lstrlen(pIn.pDescription) , N5 x* R. G# o+ H h
r = lstrcpy(s, pIn.pDescription) ) X f( L( X! t* G2 S; ^1 i
If r = 0 Then Exit Sub
% I' e2 \9 d s3 o4 c1 z pType = Left(s, r1)
: k% |) l( R/ p1 u }3 r8 f r1 = InStr(1, pType, ",")
F" \& S2 u/ D: D& G \ r = InStr(r1 + 1, pType, ",") % Y2 S6 O; {9 \
pType = Mid(pType, r1 + 1, r - r1 - 1)
. y# C/ I |0 K4 p. ]End Sub & Q) z! F; W- K8 g: U
PrinterProperties函数比较简单.你试试吗? |