|
( ^. P& G, B! H- ]2 \$ y前几天写程序用到几个打印的API函数.把研究成果和大家分享
; T- s$ ~. i. \6 b建议大家结合MSDN看看
& c8 h+ p, p' E9 k) M, M% U5 sPrivate Type PRINTER_INFO_1
, `! H' n+ Y4 g( r2 U+ C Flags As Long 5 G, t2 k$ h0 ]! \4 \
pDescription As Long + q k! Y2 Q4 t2 a) N8 g
pName As Long
: X6 }* t0 w( z5 T) m pComment As Long - P0 o4 @' h p/ ~2 R
End Type / p- i+ A1 E) m, K2 |8 ~3 R3 u) s
Private Declare Function PrinterProperties Lib "winspool.drv" (ByVal hWnd As * y' X8 M7 {" D! E3 ~! Y& s* M+ ~
Long, ByVal hPrinter As Long) As Long 2 q# u7 A- b/ d% j! k5 O
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As : S0 ^9 N! ~& X" n. g$ @
Long) As Long
4 U8 K6 j+ v2 ?5 E( @1 ^Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA"
+ R, O: M% c' T6 T0 M(ByVal pPrinterName As String, phPrinter As Long, pDefault As Long) As Long
' |! x( f- }% f. v& E4 ?5 H3 r0 n2 cPrivate Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (
5 z" z( h0 I# \. I" R eByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As
2 T, q( X& c; D) |" @Long, pcbNeeded As Long) As Long
( b. k/ }" w8 S9 E( S2 JPrivate Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" _ % l+ E9 r0 q* l
(ByVal lpString1 As String, ByVal lpString2 As Long) As Long ! k8 {3 b `1 `/ Q2 d2 f8 p+ d
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpSt
, R8 r/ }0 ?# n& V& Jring As Long) As Long
; W# o" w- L1 Q# h* Q, mGetPrinter函数返回的数据即我们想要的数据在参数pPrinter而且是一个地址指针指向 " s" _2 }8 W: U6 V4 s/ q
一个PRINTER_INFO_1结构.结构的pDescription 是指向打印机描述字符串的指针. , l4 j* R) g% c4 Y, y8 M m
在VB只好用CopyMemory,lstrcpy 和 lstrlen得到这个字符串.
. i1 |% h( {* e3 ~" z% s: r" n下面是 例程:得到打印机的类型名 : f* S; k3 n( y3 ?; e
'pDeviceName是打印机名
' Y: U# `5 |! B8 d'pType 是返回的打印机 Description中的打印机类型.这个串里还有打印机名和驱动程序
7 z( u9 `8 ]0 I* H( \Private Sub GetPrint(pDeviceName, pType As String) 3 |& Y1 @5 w8 m4 Q' E
Dim pIn As PRINTER_INFO_1 3 T4 V( h! B) I1 I0 x
Dim s As String * 256
% _- p/ N7 O, I8 y4 } Dim r As Long, phPrinter As Long, r1 As Long & A0 x5 ^2 i: j2 i" Z
On Error Resume Next
$ S% h* `( M* t2 m; G/ d7 {! C9 m6 P" m r = OpenPrinter(pDeviceName & Chr(0), phPrinter, 0&)
! _; ^5 m9 J; v# P! L* S If r = 0 Then Exit Sub
$ V; d4 A/ B6 t$ T. Z r = GetPrinter(phPrinter, 1, 0, 0, r1)
% f3 J7 y8 U1 [# n6 ^ ReDim pPrinter(r1) As Byte
+ O6 [2 }- a" l; g5 J r = GetPrinter(phPrinter, 1, pPrinter(0), r1, r1) 8 ]5 G" s& L1 M1 B) C, u
If r = 0 Then Exit Sub 9 N' }/ r1 O Q4 P _8 p
r = ClosePrinter(phPrinter) 9 U7 ], U* `7 D# l; q
CopyMemory pIn, pPrinter(0), Len(pIn)
^& I6 K: X6 V! e# i0 d* {+ _5 M# W
r1 = lstrlen(pIn.pDescription)
" M! q9 p( r% _ r = lstrcpy(s, pIn.pDescription) $ z% ]3 Y) B3 [- d% l
If r = 0 Then Exit Sub
& I7 P$ O k" R! R/ Y# s: ^, { pType = Left(s, r1) $ Y3 R) [# @; r9 T+ R2 A! t
r1 = InStr(1, pType, ",")
5 B8 p* c1 T! w r = InStr(r1 + 1, pType, ",") - \% h& E0 Q2 N* c3 |; Q2 T5 ]( K
pType = Mid(pType, r1 + 1, r - r1 - 1) 1 }! f9 \6 _9 b: q/ h9 W9 ?. |2 o. f
End Sub # }, A% a' m# [8 ? \
PrinterProperties函数比较简单.你试试吗? |