|
% O @' s2 s" q* B0 g% r# H5 L前几天写程序用到几个打印的API函数.把研究成果和大家分享 ( M; r" ^1 Z2 V6 m6 p- H
建议大家结合MSDN看看 1 k6 t: I$ i' q$ i8 B! S
Private Type PRINTER_INFO_1
# G) h: e( i7 F- e Flags As Long
! g- Z4 I# z6 O pDescription As Long ; L0 k8 c* q( p
pName As Long
+ s; A& A! D J& y& ~% F0 k4 | pComment As Long 0 \0 o# T+ i% {4 K1 m6 k& ^
End Type : v5 P, J4 T2 I1 d8 H0 w# E
Private Declare Function PrinterProperties Lib "winspool.drv" (ByVal hWnd As
0 t1 s% e# L& }6 G( mLong, ByVal hPrinter As Long) As Long
9 x& T. J7 B, j% w2 n1 P. O% ZPrivate Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As
4 U7 C/ ~# W, @0 {( N5 iLong) As Long 0 H$ \8 {+ @/ @* k, j+ a
Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" 2 a( Y; I% V, Q3 o" |
(ByVal pPrinterName As String, phPrinter As Long, pDefault As Long) As Long
: B6 z$ ]* Q6 O, k4 `Private Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" ( 1 V' R3 ^- _% E) g: \9 b; k
ByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As
" `% N4 z% I5 PLong, pcbNeeded As Long) As Long
2 e% G0 j6 t8 d5 e% G% sPrivate Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" _
' r1 x5 m% ?( _! u0 D* h (ByVal lpString1 As String, ByVal lpString2 As Long) As Long 9 b- y# N* t" _ ]7 {% q
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpSt
. n( j j0 p8 c+ q, xring As Long) As Long
( f3 l2 m7 i. o0 [! Y: j( SGetPrinter函数返回的数据即我们想要的数据在参数pPrinter而且是一个地址指针指向 ( T$ b1 Z- D; K4 ~; \, Q3 g
一个PRINTER_INFO_1结构.结构的pDescription 是指向打印机描述字符串的指针.
% P0 n P' S0 ~& L1 J在VB只好用CopyMemory,lstrcpy 和 lstrlen得到这个字符串.
, O6 w# Q/ ?, o' A4 R下面是 例程:得到打印机的类型名 ; f$ u& ~1 B6 v6 |+ u% l' D
'pDeviceName是打印机名 ( @! v: s# J3 g+ W2 F5 {6 z3 A
'pType 是返回的打印机 Description中的打印机类型.这个串里还有打印机名和驱动程序
4 e0 f& {* K1 x4 yPrivate Sub GetPrint(pDeviceName, pType As String) 3 s, j' s5 C( A& [
Dim pIn As PRINTER_INFO_1 8 F/ G" F2 q+ P9 L4 h* ]
Dim s As String * 256 8 @& {" t1 w7 Z! i- }* M# d
Dim r As Long, phPrinter As Long, r1 As Long
; f, |( y3 C5 g% L# n' |( z On Error Resume Next
: e' h1 S O- F r = OpenPrinter(pDeviceName & Chr(0), phPrinter, 0&)
/ [* O; D3 X+ g; `" j; f* r1 E0 k2 W If r = 0 Then Exit Sub
- k3 n* ]7 y9 u' Q& J Q8 u- H r = GetPrinter(phPrinter, 1, 0, 0, r1)
3 L f: j5 A" ~5 } ReDim pPrinter(r1) As Byte
0 }" R b" `" z6 E r = GetPrinter(phPrinter, 1, pPrinter(0), r1, r1)
( _8 t& `( s1 a, L( | If r = 0 Then Exit Sub ' j! M; o2 o. }
r = ClosePrinter(phPrinter)
c) W( m# ]' r3 T3 O3 ~ CopyMemory pIn, pPrinter(0), Len(pIn)
7 y! X1 b9 H6 M1 T( f5 t% K) h' D4 g
r1 = lstrlen(pIn.pDescription)
+ w& ?1 e; @- _5 E8 T1 \ r = lstrcpy(s, pIn.pDescription)
& Q$ K; ~0 B. {+ y! }9 u* E4 t/ y If r = 0 Then Exit Sub $ C3 r2 ]: Z. ^# b% h# _
pType = Left(s, r1)
8 c- U, M* D8 _1 f% U6 |" u r1 = InStr(1, pType, ",") + d# i, e, n- S. C) _ r
r = InStr(r1 + 1, pType, ",") % c/ F4 u9 s+ E* F5 |2 K+ h
pType = Mid(pType, r1 + 1, r - r1 - 1) * n+ Q8 M: ^+ Q9 J, ?: `
End Sub . L0 C$ N1 @: X
PrinterProperties函数比较简单.你试试吗? |