1,216
社区成员
发帖
与我相关
我的任务
分享
Sub GetSystemDefaultPrinter()
Dim pd As PrinterDlg
Dim pps As PrinterPageSetupDlg
pd.lStructSize = Len(pd)
pd.flags = PD_RETURNDC Or PD_RETURNDEFAULT
If PrintDlg(pd) Then
PG.HDC_Printer = pd.hdc
Dim hGlobalData As Long
'// 锁定临时空间, 获取驱动配置信息
hGlobalData = GlobalLock(ByVal pd.hDevMode)
CopyMemory PG.dev_dlgMode, ByVal hGlobalData, Len(PG.dev_dlgMode)
GlobalUnlock (hGlobalData)
GlobalFree (pd.hDevMode)
'// 锁定临时空间, 获取驱动,设备信息
hGlobalData = GlobalLock(ByVal pd.hDevNames)
CopyMemory PG.dev_dlgName, ByVal hGlobalData, Len(PG.dev_dlgName)
GlobalUnlock (hGlobalData)
GlobalFree (pd.hDevNames)
Dim mulbits() As Byte
Dim i As Long
ReDim mulbits(PG.dev_dlgName.wDriverOffset - 1)
CopyMemory mulbits(0), PG.dev_dlgName.extra(0), PG.dev_dlgName.wDriverOffset
PG.dev_DriveName = StrConv(mulbits, vbUnicode)
i = lstrlenByte(PG.dev_dlgName.extra(PG.dev_dlgName.wDriverOffset + 2))
ReDim mulbits(i - 1)
CopyMemory mulbits(0), PG.dev_dlgName.extra(PG.dev_dlgName.wDriverOffset + 2), i
PG.dev_PrinterName = StrConv(mulbits, vbUnicode)
'// 获取默认打印机的打印配置
pps.lStructSize = Len(pds)
pps.flags = PSD_INHUNDREDTHSOFMILLIMETERS Or PSD_RETURNDEFAULT
If PageSetupDlgX(pps) Then
'// 锁定临时空间, 获取驱动配置信息
hGlobalData = GlobalLock(ByVal pps.hDevMode)
CopyMemory PG.dev_dlgMode, ByVal hGlobalData, Len(PG.dev_dlgMode)
ResetDC PG.HDC_Printer, hGlobalData
GlobalUnlock (hGlobalData)
GlobalFree (pps.hDevMode)
'// 获取打印机分辨率, 每英寸内像素量
PG.PrinterResolveX = GetDeviceCaps(PG.HDC_Printer, LOGPIXELSX)
PG.PrinterResolveY = GetDeviceCaps(PG.HDC_Printer, LOGPIXELSY)
'// 转换打印机默认边距度量单位为屏幕逻辑像素
PG.dev_RectMargin = pds.rtMargin
PG.dev_RectMargin.Left = mmeterPerPixelX(PG.dev_RectMargin.Left \ 100)
PG.dev_RectMargin.Right = mmeterPerPixelX(PG.dev_RectMargin.Right \ 100)
PG.dev_RectMargin.Top = mmeterPerPixelX(PG.dev_RectMargin.Top \ 100)
PG.dev_RectMargin.bottom = mmeterPerPixelX(PG.dev_RectMargin.bottom \ 100)
'// 设置打印机视图范围度量单位为像素
SetMapMode PG.HDC_Printer, MM_ANISOTROPIC
'// 设置打印机设备窗口范围, 窗口设置屏幕分辨率
SetWindowExtEx PG.HDC_Printer, PG.ScreenResolveX, PG.ScreenResolveY, ByVal 0&
SetWindowOrgEx PG.HDC_Printer, 0, 0, ByVal 0&
'// 设置打印机设备视图范围, 设置为缩放分辨率,系统自动计算为比例
SetViewportExtEx PG.HDC_Printer, PG.PrinterResolveX, PG.PrinterResolveY, ByVal 0&
SetViewportOrgEx PG.HDC_Printer, 0, 0, ByVal 0&
'// 以上api: SetWindowExtEx ,SetViewportExtEx , 也就是说以 WindowExt 设置的视图范围, 显示以 ViewPort 设置的视图范围
'// 获取设备物理尺寸, 以像素为单位
PG.dev_PaperSize.x = GetDeviceCaps(PG.HDC_Printer, HORZRES)
PG.dev_PaperSize.y = GetDeviceCaps(PG.HDC_Printer, VERTRES)
'// 物理尺寸解析为逻辑尺寸
DPtoLP PG.HDC_Printer, PG.dev_PaperSize, 1
End If
End If
End Sub
Private Type PRINTER_DEFAULTS
pDatatype As String
pDevMode As Long
DesiredAccess As Long
End Type
Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long
Private Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
Private Declare Function EnumJobs Lib "winspool.drv" Alias "EnumJobsA" (ByVal hPrinter As Long, ByVal FirstJob As Long, ByVal NoJobs As Long, ByVal Level As Long, pJob As Byte, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Private Type JOB_INFO_1
JobId As Long
pPrinterName As Long
pMachineName As Long
pUserName As Long
pDocument As Long
pDatatype As Long
pStatus As Long
Status As Long
Priority As Long
Position As Long
TotalPages As Long
PagesPrinted As Long
Submitted As SYSTEMTIME
'dmCopies As Long
End Type
Private Const PRINTER_ACCESS_ADMINISTER = &H4
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long
Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
Private Const FORMAT_MESSAGE_IGNORE_INSERTS = &H200
Private Sub Command1_Click()
Dim hPrinter As Long
Dim RetVal As Long
Dim pd As PRINTER_DEFAULTS
Dim lngCount As Long
Dim n As Long
Dim JI1() As JOB_INFO_1
Dim aJi1() As Byte
Dim dwBytesNeed As Long
Dim dwBytesRet As Long
Dim lngSize As Long
Dim JI_1 As JOB_INFO_1
lngSize = Len(JI_1)
pd.DesiredAccess = PRINTER_ACCESS_ADMINISTER
RetVal = OpenPrinter(Printer.DeviceName, hPrinter, pd)
ReDim aJi1(lngSize - 1)
RetVal = EnumJobs(hPrinter, 0, 3, 1, aJi1(0), lngSize, dwBytesNeed, dwBytesRet)
If RetVal = 0 And dwBytesNeed = 0 Then
GetAPIError Err.LastDllError
Exit Sub
End If
If dwBytesNeed = 0 Then
MsgBox "没有打印任务!", vbInformation
Exit Sub
End If
If dwBytesNeed > lngSize Then
ReDim aJi1(dwBytesNeed - 1)
RetVal = EnumJobs(hPrinter, 0, 3, 1, aJi1(0), dwBytesNeed, dwBytesNeed, dwBytesRet)
End If
ReDim JI1(1 To dwBytesRet)
List1.Clear
'For lngCount = 1 To dwBytesRet
n=0
lngCount=1
Do
if lngSize * n > dwBytesRet then exit do
Call CopyMemory(JI1(lngCount), aJi1(lngSize * n), lngSize)
List1.AddItem "打印任务" & lngCount
List1.AddItem "JobID:" & JI1(lngCount).JobId
List1.AddItem "pPrinterName:" & GetStringFromMem(JI1(lngCount).pPrinterName)
List1.AddItem "pMachineName:" & GetStringFromMem(JI1(lngCount).pMachineName)
List1.AddItem "pUserName:" & GetStringFromMem(JI1(lngCount).pUserName)
List1.AddItem "pDocument:" & GetStringFromMem(JI1(lngCount).pDocument)
List1.AddItem "pStatus:" & JI1(lngCount).pStatus
List1.AddItem "Status:" & JI1(lngCount).Status
List1.AddItem "Priority:" & JI1(lngCount).Priority
List1.AddItem "Position:" & JI1(lngCount).Position
List1.AddItem "TotalPages:" & JI1(lngCount).TotalPages
List1.AddItem "PagesPrinted:" & JI1(lngCount).PagesPrinted
List1.AddItem "Year:" & JI1(lngCount).Submitted.wYear
List1.AddItem "Month:" & JI1(lngCount).Submitted.wMonth
List1.AddItem "Day:" & JI1(lngCount).Submitted.wDay
List1.AddItem "DayOfWeek:" & JI1(lngCount).Submitted.wDayOfWeek
List1.AddItem "Hour:" & JI1(lngCount).Submitted.wHour
List1.AddItem "Minute:" & JI1(lngCount).Submitted.wMinute
List1.AddItem "Second:" & JI1(lngCount).Submitted.wSecond
List1.AddItem "wMilliseconds:" & JI1(lngCount).Submitted.wMilliseconds
List1.AddItem "copyies:" & Printer.Copies
'Next
Loop
ClosePrinter (hPrinter)
End Sub
Public Function GetAPIError(ByVal API_ERROR As Long)
Dim Lret As Long
Dim M_Msg As String
M_Msg = String(256, " ")
Lret = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, 0&, API_ERROR, 0&, M_Msg, Len(M_Msg), 0&)
If Lret <> 0 Then
M_Msg = Trim(M_Msg)
MsgBox M_Msg, , "API错误信息"
End If
End Function
'从给定的内存地址中获得字符串
Private Function GetStringFromMem(ByVal Addr As Long) As String
Dim lngSize As Long
Dim bytStr() As Byte
Dim lngX As Long
'获得字符串的长度
Call CopyMemory(lngSize, ByVal Addr - 4, 4)
ReDim bytStr(lngSize / 2)
Call CopyMemory(bytStr(0), ByVal Addr, lngSize / 2 + 1)
GetStringFromMem = StrConv(bytStr, vbUnicode)
End Function
Copies 属性
返回或设置需要打印的份数。对于 Printer 对象,在设计时不可用。
语法
object.Copies [= number]
Copies 属性语法包含下面部分:
部分 描述
Object 对象表达式,其值是“应用于”列表中的一个对象。
Number 数值表达式,指定需要打印的份数。该值必须是整型值。
说明
对于“打印”对话框,该属性返回在“份数”框中用户输入的份数。如果设置 CommonDialog 控件的 cdlPDUseDevModeCopies 标志,则该属性始终返回 1。
对于 Printer 对象,对多份打印可能进行、也可能不进行核对,这取决于打印机驱动程序。可以将整个文档或将每一页打印多份。对于不支持核对的打印机,设置 Copies = 1,然后在程序中使用循环,就可以将整个文档打印多份。
注意 Printer 对象属性的效果取决于打印机生产商提供的驱动程序。一些属性设置可能不起作用,或几个不同的属性设置具有相同的结果。如果设置值超出可接受范围,就会产生错误。更多的信息,参阅有关驱动程序的生产商文档。