|
! _$ q% _+ ]" L2 W% K
前几天写程序用到几个打印的API函数.把研究成果和大家分享
8 }- |0 D' T3 d) d4 {6 O6 X建议大家结合MSDN看看 . n2 K2 r% _1 @1 Y# E6 N. [
Private Type PRINTER_INFO_1
$ r, g# M3 y5 {* T& f5 u O2 m Flags As Long
`" l; @+ h8 z( W* E2 n' g* O pDescription As Long . \" ~1 V& m" J. u& ?2 t0 }
pName As Long
" p6 u' ]% f7 W3 Y, `6 [+ D" ? pComment As Long 0 p* C& A1 D; ?, z& [
End Type ! E O' S9 a' n, U
Private Declare Function PrinterProperties Lib "winspool.drv" (ByVal hWnd As $ R, u- y0 f- D$ T" x8 Y- s \
Long, ByVal hPrinter As Long) As Long
+ `" j9 l% Y0 W" E! c$ h) E9 DPrivate Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As 6 i; |" S! X5 x! P% {* P
Long) As Long 9 Z- s; o. O0 G3 Z
Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" $ ^& }4 F# d) A& c8 W0 K; s+ D
(ByVal pPrinterName As String, phPrinter As Long, pDefault As Long) As Long
% K8 T& ?2 J2 XPrivate Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (
5 M5 `- o, p- bByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As
* U; V$ x" O+ W H, lLong, pcbNeeded As Long) As Long 2 y3 H: t7 H( O* d
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" _ : o5 q9 j. S) M+ K' {, i: F2 ~
(ByVal lpString1 As String, ByVal lpString2 As Long) As Long
! y0 r! ^: Q" @ F2 PPrivate Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpSt 8 S$ B. o8 v/ }; { [; _0 `0 e
ring As Long) As Long
0 M: n8 R2 q# e5 {5 u# e) \% ~' M* xGetPrinter函数返回的数据即我们想要的数据在参数pPrinter而且是一个地址指针指向 ! o0 x* b# O3 W5 `$ b$ L& c
一个PRINTER_INFO_1结构.结构的pDescription 是指向打印机描述字符串的指针.
" a3 {, B$ z: c! ?! J/ K) s& J在VB只好用CopyMemory,lstrcpy 和 lstrlen得到这个字符串. * r% y9 e/ i7 l5 [" U# J6 `
下面是 例程:得到打印机的类型名
* Q4 v0 L6 i3 g9 i# q$ ^( `8 L8 f. f+ l'pDeviceName是打印机名
, c" g1 l" g4 M/ F; z3 I$ b. {'pType 是返回的打印机 Description中的打印机类型.这个串里还有打印机名和驱动程序 2 G8 J, P/ v, s( G2 F- W ^4 ?
Private Sub GetPrint(pDeviceName, pType As String) 5 i' d B" B0 g# V* r' ^2 B& ?
Dim pIn As PRINTER_INFO_1 : k, b2 |4 c; D+ C# }
Dim s As String * 256 ; e, K. g% G4 Y: }+ Y: ^: D
Dim r As Long, phPrinter As Long, r1 As Long / Y' K; A; r4 Q: t8 l S6 I0 a- w
On Error Resume Next
) {$ T6 u7 ?- n+ D( i- J1 z r = OpenPrinter(pDeviceName & Chr(0), phPrinter, 0&) - b3 U" q* s$ `1 |
If r = 0 Then Exit Sub 8 \5 K; H" m9 a* a* }- m& X
r = GetPrinter(phPrinter, 1, 0, 0, r1) . x6 }$ C4 W6 A8 T: V) w3 p1 n
ReDim pPrinter(r1) As Byte
8 W0 W/ d- R0 u1 ]1 \, M$ c9 O& f r = GetPrinter(phPrinter, 1, pPrinter(0), r1, r1)
+ z9 L/ ?9 V3 G0 l" w7 _6 ^) S If r = 0 Then Exit Sub
" Q/ g3 y( k" K0 Z, r% I r = ClosePrinter(phPrinter) 7 ~3 T9 P, O7 o: y9 `! m7 W+ n
CopyMemory pIn, pPrinter(0), Len(pIn)
3 T# u1 F; K% a+ f
# E9 M0 C8 L3 l$ B% F, t/ U r1 = lstrlen(pIn.pDescription) : @7 w7 a; A! ~: c& N5 E2 X
r = lstrcpy(s, pIn.pDescription) ! S$ v9 t! ]: P2 N/ `, m
If r = 0 Then Exit Sub
& I9 N/ F+ v6 A0 n$ s/ p pType = Left(s, r1) / z* j# P1 K+ f% y
r1 = InStr(1, pType, ",") 8 P$ i( g2 P+ p/ L1 o1 w4 ]
r = InStr(r1 + 1, pType, ",") # O8 X" R! x5 A. O( X1 {* j
pType = Mid(pType, r1 + 1, r - r1 - 1) V; A0 l5 j3 |0 w6 y: w0 [6 |9 G; [
End Sub 3 E' `, y6 Z: g. U, y- w/ G
PrinterProperties函数比较简单.你试试吗? |