Private Const DC_PAPERNAMES = 16 Private Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal lpDeviceName As String, ByVal lpPort As String, ByVal iIndex As Long, lpOutput As Any, lpDevMode As Any) As Long Private Sub Form_Load() 'KPD-Team 2001 'URL: http://www.allapi.net/ 'E-Mail: [email protected] Dim Ret As Long, PaperSizes() As Byte, Cnt As Long, AllNames As String Dim lStart As Long, lEnd As Long 'Retrieve the number of available paper names Ret = DeviceCapabilities(Printer.DeviceName, "LPT1", DC_PAPERNAMES, ByVal 0&, ByVal 0&) 'resize the array ReDim PaperSizes(1 To Ret * 64) As Byte 'retrieve all the available paper names Call DeviceCapabilities(Printer.DeviceName, "LPT1", DC_PAPERNAMES, PaperSizes(1), ByVal 0&) 'set the form's graphic mode to persistent Me.AutoRedraw = True Me.Print "Supported papersizes:" 'convert the retrieved byte array to a string AllNames = StrConv(PaperSizes, vbUnicode) 'loop through the string and search for the names of the papers Do lEnd = InStr(lStart + 1, AllNames, Chr$(0), vbBinaryCompare) If (lEnd > 0) And (lEnd - lStart - 1 > 0) Then Me.Print Mid$(AllNames, lStart + 1, lEnd - lStart - 1) End If lStart = lEnd Loop Until lEnd = 0 End Sub
Dim strDeviceName As String Dim objPrint As Printer Dim lngPrint As Long Dim lngCount As Long Dim intType() As Integer Dim strPaperNames As String Dim strPName As String Dim lngPos As Long Dim strTmp As String Dim lngX As Long
strDeviceName = printer.devicename For Each objPrint In Printers If objPrint.DeviceName = strDeviceName Then If OpenPrinter(objPrint.DeviceName, lngPrint, 0) <> 0 Then lngCount = DeviceCapabilities(objPrint.DeviceName, objPrint.Port, DC_PAPERS, ByVal vbNullString, 0) ReDim intType(1 To lngCount) strPaperNames = String(lngCount * 64, 0) '获得纸张类型的值,返回值lngCount为纸张类型的数量 lngCount = DeviceCapabilities(objPrint.DeviceName, objPrint.Port, DC_PAPERS, intType(1), 0) '获得纸张类型名称 lngCount = DeviceCapabilities(objPrint.DeviceName, objPrint.Port, DC_PAPERNAMES, ByVal strPaperNames, 0) For lngX = 1 To lngCount '每个名称的字节长度为64。 '如果名称中包含汉字,则每个名称的字节长度小于64, '在获得下一个名称时,需减去累积汉字的个数,才能得到正确的起始位置 strPName = Mid(strPaperNames, 64 * (lngX - 1) + 1 - lngPos, 64) strTmp = StrReverse(strPName) lngPos = lngPos + InStr(strTmp, Chr(0)) - 1 strPName = Left(strPName, InStr(strPName, Chr(0)) - 1) cboPapers.AddItem intType(lngX) 'pagesize cboPapers.List(lngX - 1, 1) = strPName 'pagename Next End If ClosePrinter (lngPrint) Exit For End If Next
Private Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As Long) As Long Private Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal lpDeviceName As String, ByVal lpPort As String, ByVal iIndex As Long, lpOutput As Any, ByVal dev As Long) As Long Private Const DC_PAPERNAMES = 16 Private Const DC_PAPERS = 2
Private Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal lpDeviceName As String, ByVal lpPort As String, ByVal iIndex As Long, lpOutput As Any, lpDevMode As Any) As Long
Private Sub Form_Load()
'KPD-Team 2001
'URL: http://www.allapi.net/
'E-Mail: [email protected]
Dim Ret As Long, PaperSizes() As Byte, Cnt As Long, AllNames As String
Dim lStart As Long, lEnd As Long
'Retrieve the number of available paper names
Ret = DeviceCapabilities(Printer.DeviceName, "LPT1", DC_PAPERNAMES, ByVal 0&, ByVal 0&)
'resize the array
ReDim PaperSizes(1 To Ret * 64) As Byte
'retrieve all the available paper names
Call DeviceCapabilities(Printer.DeviceName, "LPT1", DC_PAPERNAMES, PaperSizes(1), ByVal 0&)
'set the form's graphic mode to persistent
Me.AutoRedraw = True
Me.Print "Supported papersizes:"
'convert the retrieved byte array to a string
AllNames = StrConv(PaperSizes, vbUnicode)
'loop through the string and search for the names of the papers
Do
lEnd = InStr(lStart + 1, AllNames, Chr$(0), vbBinaryCompare)
If (lEnd > 0) And (lEnd - lStart - 1 > 0) Then
Me.Print Mid$(AllNames, lStart + 1, lEnd - lStart - 1)
End If
lStart = lEnd
Loop Until lEnd = 0
End Sub
今晚我验证一下,如果OK,1060分一定奉上。
你提供的例程能够得到papername,那么如何将papersize和papername对应起来呢?例如papersize=9,对应的papername为A4.
Dim objPrint As Printer
Dim lngPrint As Long
Dim lngCount As Long
Dim intType() As Integer
Dim strPaperNames As String
Dim strPName As String
Dim lngPos As Long
Dim strTmp As String
Dim lngX As Long
strDeviceName = printer.devicename
For Each objPrint In Printers
If objPrint.DeviceName = strDeviceName Then
If OpenPrinter(objPrint.DeviceName, lngPrint, 0) <> 0 Then
lngCount = DeviceCapabilities(objPrint.DeviceName, objPrint.Port, DC_PAPERS, ByVal vbNullString, 0)
ReDim intType(1 To lngCount)
strPaperNames = String(lngCount * 64, 0)
'获得纸张类型的值,返回值lngCount为纸张类型的数量
lngCount = DeviceCapabilities(objPrint.DeviceName, objPrint.Port, DC_PAPERS, intType(1), 0)
'获得纸张类型名称
lngCount = DeviceCapabilities(objPrint.DeviceName, objPrint.Port, DC_PAPERNAMES, ByVal strPaperNames, 0)
For lngX = 1 To lngCount
'每个名称的字节长度为64。
'如果名称中包含汉字,则每个名称的字节长度小于64,
'在获得下一个名称时,需减去累积汉字的个数,才能得到正确的起始位置
strPName = Mid(strPaperNames, 64 * (lngX - 1) + 1 - lngPos, 64)
strTmp = StrReverse(strPName)
lngPos = lngPos + InStr(strTmp, Chr(0)) - 1
strPName = Left(strPName, InStr(strPName, Chr(0)) - 1)
cboPapers.AddItem intType(lngX) 'pagesize
cboPapers.List(lngX - 1, 1) = strPName 'pagename
Next
End If
ClosePrinter (lngPrint)
Exit For
End If
Next
Private Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal lpDeviceName As String, ByVal lpPort As String, ByVal iIndex As Long, lpOutput As Any, ByVal dev As Long) As Long
Private Const DC_PAPERNAMES = 16
Private Const DC_PAPERS = 2
是D1VB的泰山吗?好久不见了,呵呵
: egrid() 仔细看看程序,里面已经将papersize和papername对应起来了.
另外,我不知道如何"自定义纸张",所以没法测是否能得到这种种纸张的名字. : darkmoon(啥也不会) 你的代码太罗嗦,也不大对,要改改才能用.