|
! U& x, r+ o. _8 i, g1 A( _
前几天写程序用到几个打印的API函数.把研究成果和大家分享 - t! u: N/ L Q9 m& I: J9 ~* r5 B
建议大家结合MSDN看看
) h" A" ^! J* I8 L% V! cPrivate Type PRINTER_INFO_1 + {% T7 H8 U) ]
Flags As Long
& v; d! X; k9 @; x$ P( `% P& R( w pDescription As Long ( N- J% r7 C7 u$ W* W: ]# D
pName As Long
% r* |* ?) J3 c& K, o pComment As Long 1 c! }0 d, P! F8 C1 ]0 i i
End Type 7 n8 r1 V+ E( ` b" C' _" b
Private Declare Function PrinterProperties Lib "winspool.drv" (ByVal hWnd As : x' v) q. @* N6 X0 v# |6 Z3 [
Long, ByVal hPrinter As Long) As Long ! ^5 `( q' f( Z/ `) E& {5 q
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As
+ V4 K- g/ E* C7 j: N0 o6 ZLong) As Long
$ ^& a. M! h" Z# o2 v, ]6 ZPrivate Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA"
! {, W5 h0 O! l2 i ?5 R4 @; f7 j(ByVal pPrinterName As String, phPrinter As Long, pDefault As Long) As Long
: o8 t( J( y8 M' F' L- ZPrivate Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (
1 J& M. d) V9 D) e* a _- I) Z- DByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As
* _5 e% q, t) }2 z( j1 N. \% RLong, pcbNeeded As Long) As Long
q( _) o3 k- Q: p% R. z! G4 [Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" _ , F- q$ W7 g4 T6 z
(ByVal lpString1 As String, ByVal lpString2 As Long) As Long
[0 Y, M% k4 N& N+ a5 @ }- s- ePrivate Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpSt h, K, y) M: @. [5 R
ring As Long) As Long
5 ]! W7 {/ J/ z' PGetPrinter函数返回的数据即我们想要的数据在参数pPrinter而且是一个地址指针指向 2 Q, p$ q1 L/ }2 Q4 @9 m
一个PRINTER_INFO_1结构.结构的pDescription 是指向打印机描述字符串的指针.
3 \; {, m2 a3 s0 S& D; v在VB只好用CopyMemory,lstrcpy 和 lstrlen得到这个字符串.
4 T. b" Y& w5 d2 u6 @下面是 例程:得到打印机的类型名 ; i4 T" Y4 j6 J' z4 ^! L4 l4 K
'pDeviceName是打印机名 , v: E) t/ _& q* Q) n9 Q- d8 J
'pType 是返回的打印机 Description中的打印机类型.这个串里还有打印机名和驱动程序
) T$ X: q2 {; s. r$ O+ q% WPrivate Sub GetPrint(pDeviceName, pType As String) 8 M0 ]' m- ]) S/ \/ e8 G( z& q3 J
Dim pIn As PRINTER_INFO_1 + a; n4 z( s* l0 Y3 h0 e
Dim s As String * 256 . B1 w) G# K* c+ w% x9 y
Dim r As Long, phPrinter As Long, r1 As Long
; x/ o3 G3 B4 ~* e% g; } On Error Resume Next
- a- h. J2 s, i% _' i' [ r = OpenPrinter(pDeviceName & Chr(0), phPrinter, 0&)
! y8 E H, e4 d9 ?. O If r = 0 Then Exit Sub + S, t) U; ~* T6 L, [
r = GetPrinter(phPrinter, 1, 0, 0, r1) . p9 R2 }9 L* H
ReDim pPrinter(r1) As Byte
! V+ Y8 g0 K0 p6 _ Z+ {( ?. l r = GetPrinter(phPrinter, 1, pPrinter(0), r1, r1) 1 W E9 n/ ~8 s1 ?, z* j( I3 v
If r = 0 Then Exit Sub 0 R9 t1 ]* v- K) ]; B/ u6 ~. V4 v
r = ClosePrinter(phPrinter)
' O. `2 X! M. X) `; H7 n$ |7 G. Q CopyMemory pIn, pPrinter(0), Len(pIn) " s. D5 Y+ I7 o: Q8 _2 w
1 v7 M7 y- l1 i
r1 = lstrlen(pIn.pDescription) 3 g; ^9 Q4 W) v8 ]0 M
r = lstrcpy(s, pIn.pDescription)
! L) {" ?( r" } }3 X4 O1 V' }# h If r = 0 Then Exit Sub
7 W& b6 l- q2 ~ pType = Left(s, r1) 0 ?/ c. i# c h0 _
r1 = InStr(1, pType, ",") 4 c$ [; b! |3 r Y& z; `, z4 A
r = InStr(r1 + 1, pType, ",")
2 ~2 {3 N4 E4 P4 q$ V! E# q pType = Mid(pType, r1 + 1, r - r1 - 1) 1 B" O1 R9 M' h: m
End Sub
$ ]: x7 Q# T5 O! ^PrinterProperties函数比较简单.你试试吗? |