|
. f2 @2 H0 C# k$ f! x
前几天写程序用到几个打印的API函数.把研究成果和大家分享 1 ^! B- O& t/ F* [2 P/ h" J; z7 y
建议大家结合MSDN看看 2 U+ Z# F4 N' U1 p3 `+ D
Private Type PRINTER_INFO_1 : V, @+ e' Q4 H5 l( H
Flags As Long + l4 `% ^! H- M$ i9 w& q! I
pDescription As Long : S* b) c I$ ~; U
pName As Long + {0 W9 s8 _# K7 M1 {; W
pComment As Long 8 r9 j O) W. d2 r
End Type
7 ^. P8 @. t' N- L m8 OPrivate Declare Function PrinterProperties Lib "winspool.drv" (ByVal hWnd As 4 C3 K8 l! |& r# O5 l& T
Long, ByVal hPrinter As Long) As Long - ^5 e9 _6 M" a6 a4 K
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As
$ g+ [' N# j' |+ ILong) As Long
: m* |/ o1 Z; SPrivate Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA"
; F1 F a# E" ^; N& L# a( c(ByVal pPrinterName As String, phPrinter As Long, pDefault As Long) As Long
. H0 @& Y' |% W, IPrivate Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (
9 J: M" n( t' Q0 m" C/ HByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As
" }8 G1 s0 a( DLong, pcbNeeded As Long) As Long h8 u+ R4 X0 [
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" _ 5 M3 J9 _6 `0 `8 P2 K* o0 T w" v
(ByVal lpString1 As String, ByVal lpString2 As Long) As Long ) ~6 C) G7 I' f' h J0 |
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpSt
# Q+ L3 k/ U! n" m- j% Bring As Long) As Long
; b8 I$ ]5 Q9 ?$ b4 c& H& V* E% v: Q( |GetPrinter函数返回的数据即我们想要的数据在参数pPrinter而且是一个地址指针指向 9 R- I5 o7 |- H5 @# p) S2 u
一个PRINTER_INFO_1结构.结构的pDescription 是指向打印机描述字符串的指针.
2 ]0 T5 c) \# ^4 ? a J: J1 d, U在VB只好用CopyMemory,lstrcpy 和 lstrlen得到这个字符串. 9 x2 U, ~" {/ s. h! V2 j7 u/ D" M
下面是 例程:得到打印机的类型名
& L8 ^& \: e; j; V/ H2 D) n7 }8 x'pDeviceName是打印机名
- ^" P+ M: [1 L0 M! V0 _& f0 `'pType 是返回的打印机 Description中的打印机类型.这个串里还有打印机名和驱动程序
& G% r6 _! \ Q/ ~8 r4 L2 cPrivate Sub GetPrint(pDeviceName, pType As String) % u/ e3 V; y, K/ |4 E
Dim pIn As PRINTER_INFO_1
7 c, E4 z& E( [# Q, n Dim s As String * 256
% _$ [- E& A4 E. I2 } Dim r As Long, phPrinter As Long, r1 As Long 7 j4 s! W. ~: U' c7 G; V
On Error Resume Next & J/ o0 c& N/ I
r = OpenPrinter(pDeviceName & Chr(0), phPrinter, 0&) 5 N! o+ x" \. d- ?# ~0 x6 U" i
If r = 0 Then Exit Sub 0 x3 a; P; h1 w6 c4 t
r = GetPrinter(phPrinter, 1, 0, 0, r1)
% g; D; o! o6 W$ S4 P ReDim pPrinter(r1) As Byte 5 i9 y, P4 H8 Y/ E. p
r = GetPrinter(phPrinter, 1, pPrinter(0), r1, r1)
7 N8 s5 r& `% e8 l0 s- F If r = 0 Then Exit Sub ' G: o2 X: w0 t
r = ClosePrinter(phPrinter)
9 a6 ]9 [+ o Q# q, E' @2 E3 \ CopyMemory pIn, pPrinter(0), Len(pIn) ) h0 T# h3 r- H' `
5 N9 O% x$ z5 V2 C; h w$ ^5 b2 q
r1 = lstrlen(pIn.pDescription)
7 q5 C# H1 ~8 f0 s r = lstrcpy(s, pIn.pDescription) 3 C8 f' L* F" H6 ?7 `+ n/ p
If r = 0 Then Exit Sub : ?' N2 x/ ]" S
pType = Left(s, r1)
! ] L+ }8 d3 K6 i6 l r1 = InStr(1, pType, ",")
* Z, d/ q3 K* i' B+ a: X5 v r = InStr(r1 + 1, pType, ",")
& U9 }: `' v/ i8 { pType = Mid(pType, r1 + 1, r - r1 - 1) 1 P- O E* G; H, [: S3 l
End Sub 8 {1 N) a7 r: c/ o( p" b% y+ T
PrinterProperties函数比较简单.你试试吗? |