|
9 g5 \ {& B* |1 T! {* B' Z前几天写程序用到几个打印的API函数.把研究成果和大家分享
( t' m9 n; {2 a8 ?( J% [( J( F建议大家结合MSDN看看
8 Y, O2 F' x% `+ y- {3 XPrivate Type PRINTER_INFO_1 - U- l% H; M. w6 @; q. y& v3 U
Flags As Long
/ I* Y1 A8 C5 o' i7 l: }5 }7 [ pDescription As Long
& E; z0 H! I6 i) `7 ? pName As Long * B( Z" Z- d5 i2 J
pComment As Long ) L! @! m9 A) Q( I# h( c+ Z
End Type
* n. r6 f+ v# `Private Declare Function PrinterProperties Lib "winspool.drv" (ByVal hWnd As ) b+ I8 u* p, B5 O5 |8 V1 s7 W
Long, ByVal hPrinter As Long) As Long
2 I1 W! I" Q& [0 @1 _Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As 7 l& q0 p) {# m4 g
Long) As Long 6 L# h6 ]: f4 g
Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA"
% @2 u* ~6 ^3 I3 z# @(ByVal pPrinterName As String, phPrinter As Long, pDefault As Long) As Long
$ p7 ^3 s# f6 c+ d6 {Private Declare Function GetPrinter Lib "winspool.drv" Alias "GetPrinterA" (
- V) K2 i) s7 ]$ T& GByVal hPrinter As Long, ByVal Level As Long, pPrinter As Any, ByVal cbBuf As . K, e& b" q6 W, [4 d, J( X
Long, pcbNeeded As Long) As Long " E& s1 E& U8 u9 a$ x5 l4 q
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" _ 6 Y9 s* A# U$ M2 h
(ByVal lpString1 As String, ByVal lpString2 As Long) As Long % W9 v9 Q/ K$ V% t4 R
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpSt 8 ?, k! k* u( x5 | _. G2 V
ring As Long) As Long 5 o- d& ~8 ?( j1 C2 `7 L+ U y
GetPrinter函数返回的数据即我们想要的数据在参数pPrinter而且是一个地址指针指向 $ ~! I- a% `* \. m$ I; t' y
一个PRINTER_INFO_1结构.结构的pDescription 是指向打印机描述字符串的指针. & L: G S2 M% q
在VB只好用CopyMemory,lstrcpy 和 lstrlen得到这个字符串.
9 i$ C& A- A; Y* T( l+ N下面是 例程:得到打印机的类型名
) D9 F0 v* n4 v'pDeviceName是打印机名 , ]8 i, H7 z6 I) q1 t6 l6 `
'pType 是返回的打印机 Description中的打印机类型.这个串里还有打印机名和驱动程序
% h$ X& b& z7 k" f- [% P! o5 rPrivate Sub GetPrint(pDeviceName, pType As String)
3 j6 Q4 W1 W1 M, j: }7 f Dim pIn As PRINTER_INFO_1
b2 R4 n0 w5 K" t5 w4 \5 T# r! m+ J Dim s As String * 256 . `* _0 k9 `+ W2 M
Dim r As Long, phPrinter As Long, r1 As Long 0 C: x8 g8 J* r6 F% { ]
On Error Resume Next
; J+ h0 d; A$ S: H% d1 u) U r = OpenPrinter(pDeviceName & Chr(0), phPrinter, 0&) 4 f7 ~% Z( o! f# X' ?
If r = 0 Then Exit Sub - _4 B: M% F% x$ A6 C
r = GetPrinter(phPrinter, 1, 0, 0, r1)
1 M; U* u( L7 O1 | ReDim pPrinter(r1) As Byte
: H7 P/ v3 i* d2 o r = GetPrinter(phPrinter, 1, pPrinter(0), r1, r1) . T {5 W w3 z: T* h; C1 N
If r = 0 Then Exit Sub
; C9 t/ W# e) V2 Y! |0 t/ S+ ` r = ClosePrinter(phPrinter)
* R: A; u! |" [- Z7 m, n$ W) R) L& X CopyMemory pIn, pPrinter(0), Len(pIn) ! t( F) ?3 d# \, C% J% I5 @
* K" G9 l# f( G8 h+ }. w8 l. }4 H
r1 = lstrlen(pIn.pDescription) + k, ]; j+ x' W' Y: Q# W
r = lstrcpy(s, pIn.pDescription) 9 a6 S k: `/ s0 x3 q, ` T; G
If r = 0 Then Exit Sub
! _3 r. s! S4 C0 ?7 w- H pType = Left(s, r1) * C! H$ M4 }) t1 |& P0 x+ P4 K; _6 L
r1 = InStr(1, pType, ",") ( o$ {) \. R. {
r = InStr(r1 + 1, pType, ",") 3 g# \7 w; b) f. r* v
pType = Mid(pType, r1 + 1, r - r1 - 1) ( F5 h- H' g8 b1 b' E. S7 A% q; U
End Sub ' @) Y: u8 d5 a5 U; ?5 S
PrinterProperties函数比较简单.你试试吗? |