|
: c9 }* w; o1 g4 G, r前几天写程序用到几个打印的API函数.把研究成果和大家分享 3 h+ V+ w& v" a! Q; L5 u( L/ J/ i
建议大家结合MSDN看看
/ {; ^* C- O2 ]1 ]Private Type PRINTER_INFO_1 1 |: \- [' m: A3 u8 |, h
Flags As Long
2 ?3 D0 |. V3 @, L. P* T pDescription As Long
- h/ B8 F7 [4 @6 `& {8 W( R pName As Long
. O2 k) L6 N! m( H4 } pComment As Long
8 d j. _. E, ~; I. q! rEnd Type ' p5 g3 s0 b& y: ~6 a2 M
Private Declare Function PrinterProperties Lib "winspool.drv" (ByVal hWnd As 9 Z- b9 ?9 \* Z' ^7 V
Long, ByVal hPrinter As Long) As Long
" M$ X; U. I$ u/ E' X/ APrivate Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As 8 e2 C; v9 h* d5 ~
Long) As Long
" d# x. r3 J6 n4 p: i% M/ m7 LPrivate Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA"
; b$ F2 ~& N6 @* r3 W(ByVal pPrinterName As String, phPrinter As Long, pDefault As Long) As Long - d9 R3 l/ F5 C) [
Private Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" ( 7 |4 X7 {3 {! t! v' q3 S! J6 r
ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As ! C0 `1 w* f) V- o
Long, pcbNeeded As Long) As Long
2 w1 {& |$ c& O* G( zPrivate Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" _ r! c0 x9 u" q
(ByVal lpString1 As String, ByVal lpString2 As Long) As Long
* V. U2 [+ P2 W/ u( j2 gPrivate Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpSt / R5 Z/ {# |6 \! N$ Z6 q2 a
ring As Long) As Long 4 j+ t4 j( ?- P1 G6 a2 }
GetPrinter函数返回的数据即我们想要的数据在参数pPrinter而且是一个地址指针指向 . C. L3 Y. M2 o8 f' q, @
一个PRINTER_INFO_1结构.结构的pDescription 是指向打印机描述字符串的指针. , |9 e5 i6 V6 K6 j8 ]# |; }& u U1 V0 R+ m
在VB只好用CopyMemory,lstrcpy 和 lstrlen得到这个字符串. ; q0 @7 ?9 Z4 ^1 f' u( z
下面是 例程:得到打印机的类型名
4 d# g6 V0 Q" D- Z'pDeviceName是打印机名
9 T; P4 D: Y, ^* `/ q" P'pType 是返回的打印机 Description中的打印机类型.这个串里还有打印机名和驱动程序
- G* H o0 v" n( ^Private Sub GetPrint(pDeviceName, pType As String) # j+ D( d6 d2 L# }* u9 c% ~! y
Dim pIn As PRINTER_INFO_1 4 f% h) P7 `# ~8 h
Dim s As String * 256 . {% q8 L/ k/ _5 ^2 d
Dim r As Long, phPrinter As Long, r1 As Long
$ W3 e8 V" c2 u8 q% G On Error Resume Next
W8 y$ ~# ]: Z, @ r = OpenPrinter(pDeviceName & Chr(0), phPrinter, 0&) 7 |! O$ ~$ E6 |0 ~
If r = 0 Then Exit Sub
* l) N- o7 W/ E" P r = GetPrinter(phPrinter, 1, 0, 0, r1)
8 N% u$ @, `3 N H i- P6 c ReDim pPrinter(r1) As Byte
" C$ K! A, x) L2 h r = GetPrinter(phPrinter, 1, pPrinter(0), r1, r1) + M$ o" I) O, O$ p3 u
If r = 0 Then Exit Sub 3 n6 G; B3 i) G; |% f1 M
r = ClosePrinter(phPrinter) 8 |6 `. ?' m0 j" W, S4 n! t- u
CopyMemory pIn, pPrinter(0), Len(pIn)
& ]4 T5 G* U! z; y7 S3 n, N2 f# Y, D U" K0 x0 }
r1 = lstrlen(pIn.pDescription)
& L+ u* z t+ o& R/ e* e5 v r = lstrcpy(s, pIn.pDescription)
2 @, ^' x# B. U* r7 U+ y$ ? If r = 0 Then Exit Sub
3 K& x0 P! _5 e6 j! S$ R pType = Left(s, r1)
/ B9 Q' _3 ]+ W: j r1 = InStr(1, pType, ",") ' t0 l$ ~( b! A
r = InStr(r1 + 1, pType, ",") $ }5 `5 g$ Z4 V/ b& e
pType = Mid(pType, r1 + 1, r - r1 - 1)
6 d% A& O: ]$ [2 r7 aEnd Sub * K c; _/ C0 |; e, X. I I0 g
PrinterProperties函数比较简单.你试试吗? |