可以用API获得打印机支持的纸张类型,然后比较。

解决方案 »

  1.   

    我也知道是用API,可我不知道用什么函数。
    我现在是:
        用API在程序里改变了默认打印机的纸张大小和打印方向。可我没有办法判断更改后的纸张能不能在默认打印机上使用。
        你有更详细点的说明吗?
        在线等待。
      

  2.   

    Private Sub FillPapers(sName As String, sPort As String)
    '参数说明:
    'sName------打印机名称Printer.DeviceName
    'sPort------打印机端口Printer.Port
        On Error Resume Next
        Dim PaperCount As Long
        Dim PaperSize As Integer
        Dim bytePaperNames() As Byte
        Dim bytePaperSizes() As Byte
        Dim sInfo As String
        Dim i As Long
        
        Dim hPrn As Long
        Dim PrnDef As PRINTER_DEFAULTS
        Dim lbNeed As Long
        Dim dm As DEVMODE
        Dim bDM() As Byte
        Dim lResult As Long
        
        Screen.MousePointer = vbHourglass
        PrnDef.DesiredAccess = PRINTER_ALL_ACCESS
        lResult = OpenPrinter(sName, hPrn, PrnDef)
    '    CopyMemory dm, mb_CurDM(1), Len(dm)
        lbNeed = DocumentProperties(Me.hwnd, hPrn, sName, dm, dm, 0&)
        ReDim bDM(1 To lbNeed)
        CopyMemory bDM(1), mb_CurDM(1), lbNeed
        
        PaperCount = DeviceCapabilities(sName, sPort, DC_PAPERNAMES, 0&, bDM(1))
        If PaperCount <= 0 Then
            cboPrinter(1).Clear
            MsgBox "打印机" & sName & "无有效的打印纸张规格!请检查是否正确安装了该打印机.", vbInformation, VCSPRINTTITLE
            Screen.MousePointer = vbDefault
            Exit Sub
        End If
        Dim l As Long
        ReDim bytePaperNames(1 To 64 * PaperCount)
        Call DeviceCapabilities(sName, sPort, DC_PAPERNAMES, VarPtr(bytePaperNames(1)), bDM(1))    ReDim bytePaperSizes(1 To 2 * PaperCount)
        Call DeviceCapabilities(sName, sPort, DC_PAPERS, VarPtr(bytePaperSizes(1)), bDM(1))
        
        cboPrinter(1).Clear
        For i = 1 To PaperCount
            sInfo = StrConv(MidB(bytePaperNames, (i - 1) * 64 + 1, 64), vbUnicode)
            cboPrinter(1).AddItem Left(sInfo, InStr(sInfo, Chr(0)) - 1)  '纸张名称
            CopyMemory PaperSize, bytePaperSizes((i - 1) * 2 + 1), 2
            cboPrinter(1).ItemData(cboPrinter(1).NewIndex) = PaperSize
            DoEvents
        Next i
        
        Call GetLimExtent(sName, sPort, m_MinWidth, m_MaxWidth, m_MinHeight, m_MaxHeight)
        Call GetCurPaper(PaperCount)
        
        Screen.MousePointer = vbDefault
        
    End Sub以上GetLimExtent、GetCurPaper的两个函数是我自己的另外两个功能块,与此无关。
    以上mb_CurDM是另外一个模块级变量,就是通过API函数DocumentProperties或GetPrinter得到。请参看MSDN     这是以前一个帖子的节选,目的是列出一个打印机所可以打印的所有纸张大小的类型,你看看吧!