文章編號: 190218 - 上次校閱: 2004年7月14日 - 版次: 2.2

如何從印表機驅動程式擷取設定

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

結論

Visual Basic Printer 物件可讓您取得許多印表機驅動程式屬性,但它不能讓您存取給所有人員。下列範例會示範如何從印表機驅動程式使用 WIN32 API 擷取資訊。

其他相關資訊

印表機的設定儲存在稱為 [DEVMODE 結構中。這個範例會擷取目前的預設印表機的 DEVMODE,並在清單方塊中顯示它的設定。請注意這些數字必須相較於以判斷它們的意義的常數的值。本文只包括程式碼實際上會顯示的值的常數。其他常數,請參閱本文結尾的 < 參考 > 一節。

下列範例包含兩個自訂函數 StripNulls 和 ByteToString。StripNulls 只採用一個字串,並移除起始於第一個 Null 的所有字元。這是因為在 Visual Basic 5.0 固定長度字串以 Null 填補代替 Visual Basic 4.0 所用空格用 RTrim 函數的位置。ByteToString 函式將位元組陣列轉換 String。[DEVMODE 包含兩個這類陣列。

有兩個特殊相關附註當 Windows NT 底下執行下面的範例。 第一個驅動程式有其 dmColor 屬性設定為 [2,這表示它們報告的彩色印刷能夠被但真的非許多的單色。而且,部份設定為 「 一般/純文字 」 印表機驅動程式可能無法精確 NT 之下。

雖說是逐步範例

  1. 開啟新的標準 EXE 專案。預設會建立 Form1。
  2. 將一個指令按鈕和清單方塊新增到 [表單]。
  3. 將下列程式碼加入至表單的模組:
          Option Explicit
    
          Private Const NULLPTR = 0&
          ' Constants for DEVMODE
          Private Const CCHDEVICENAME = 32
          Private Const CCHFORMNAME = 32
          ' Constants for DocumentProperties
          Private Const DM_MODIFY = 8
          Private Const DM_COPY = 2
          Private Const DM_IN_BUFFER = DM_MODIFY
          Private Const DM_OUT_BUFFER = DM_COPY
          ' Constants for dmOrientation
          Private Const DMORIENT_PORTRAIT = 1
          Private Const DMORIENT_LANDSCAPE = 2
          ' Constants for dmPrintQuality
          Private Const DMRES_DRAFT = (-1)
          Private Const DMRES_HIGH = (-4)
          Private Const DMRES_LOW = (-2)
          Private Const DMRES_MEDIUM = (-3)
          ' Constants for dmTTOption
          Private Const DMTT_BITMAP = 1
          Private Const DMTT_DOWNLOAD = 2
          Private Const DMTT_DOWNLOAD_OUTLINE = 4
          Private Const DMTT_SUBDEV = 3
          ' Constants for dmColor
          Private Const DMCOLOR_COLOR = 2
          Private Const DMCOLOR_MONOCHROME = 1
          ' Constants for dmCollate
          Private Const DMCOLLATE_FALSE = 0
          Private Const DMCOLLATE_TRUE = 1
          Private Const DM_COLLATE As Long = &H8000
          ' Constants for dmDuplex
          Private Const DM_DUPLEX = &H1000&
          Private Const DMDUP_HORIZONTAL = 3
          Private Const DMDUP_SIMPLEX = 1
          Private Const DMDUP_VERTICAL = 2
    
          Private Type DEVMODE
              dmDeviceName(1 To CCHDEVICENAME) As Byte
              dmSpecVersion As Integer
              dmDriverVersion As Integer
              dmSize As Integer
              dmDriverExtra As Integer
              dmFields As Long
              dmOrientation As Integer
              dmPaperSize As Integer
              dmPaperLength As Integer
              dmPaperWidth As Integer
              dmScale As Integer
              dmCopies As Integer
              dmDefaultSource As Integer
              dmPrintQuality As Integer
              dmColor As Integer
              dmDuplex As Integer
              dmYResolution As Integer
              dmTTOption As Integer
              dmCollate As Integer
              dmFormName(1 To CCHFORMNAME) As Byte
              dmUnusedPadding As Integer
              dmBitsPerPel As Integer
              dmPelsWidth As Long
              dmPelsHeight As Long
              dmDisplayFlags As Long
              dmDisplayFrequency As Long
                    
          End Type
    
          Private Declare Function OpenPrinter Lib "winspool.drv" Alias _
          "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, _
          ByVal pDefault As Long) As Long
    
          Private Declare Function DocumentProperties Lib "winspool.drv" _ 
          Alias "DocumentPropertiesA" (ByVal hwnd As Long, _ 
          ByVal hPrinter As Long, ByVal pDeviceName As String, _ 
          pDevModeOutput As Any, ByVal pDevModeInput As Long, _ ByVal fMode As Long)
          As Long      
    
          Private Declare Function ClosePrinter Lib "winspool.drv" _
          (ByVal hPrinter As Long) As Long
    
          Private Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" _
          (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
    
          Function StripNulls(OriginalStr As String) As String
             If (InStr(OriginalStr, Chr(0)) > 0) Then
                OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
             End If
             StripNulls = Trim(OriginalStr)
          End Function
    
          Function ByteToString(ByteArray() As Byte) As String
            Dim TempStr As String
            Dim I As Integer
    
            For I = 1 To CCHDEVICENAME
                TempStr = TempStr & Chr(ByteArray(I))
            Next I
            ByteToString = StripNulls(TempStr)
          End Function
    
          Function GetPrinterSettings(szPrinterName As String, hdc As Long) _
          As Boolean
          Dim hPrinter As Long
          Dim nSize As Long
          Dim pDevMode As DEVMODE
          Dim aDevMode() As Byte
          Dim TempStr As String
    
            If OpenPrinter(szPrinterName, hPrinter, NULLPTR) <> 0 Then
               nSize = DocumentProperties(NULLPTR, hPrinter, szPrinterName, _
               NULLPTR, NULLPTR, 0)
              If nSize < 1 Then
                GetPrinterSettings = False
                Exit Function
              End If
              ReDim aDevMode(1 To nSize)
              nSize = DocumentProperties(NULLPTR, hPrinter, szPrinterName, _
              aDevMode(1), NULLPTR, DM_OUT_BUFFER)
              If nSize < 0 Then
                GetPrinterSettings = False
                Exit Function
              End If
             Call CopyMemory(pDevMode, aDevMode(1), Len(pDevMode))
    
    
             List1.Clear   ' empty the ListBox
             List1.AddItem "Printer Name: " & _
             ByteToString(pDevMode.dmDeviceName)
    
             If pDevMode.dmOrientation = DMORIENT_PORTRAIT Then
                TempStr = "PORTRAIT"
             ElseIf pDevMode.dmOrientation = DMORIENT_LANDSCAPE Then
                TempStr = "LANDSCAPE"
             Else
                TempStr = "UNDEFINED"
             End If
             List1.AddItem "Orientation: " & TempStr
    
             Select Case pDevMode.dmPrintQuality
                Case DMRES_DRAFT
                    TempStr = "DRAFT"
                Case DMRES_HIGH
                    TempStr = "HIGH"
                Case DMRES_LOW
                    TempStr = "LOW"
                Case DMRES_MEDIUM
                    TempStr = "MEDIUM"
                Case Else   ' positive value
                    TempStr = CStr(pDevMode.dmPrintQuality) & " dpi"
             End Select
             List1.AddItem "Print Quality: " & TempStr
    
             Select Case pDevMode.dmTTOption
                Case DMTT_BITMAP    ' default for dot-matrix printers
                    TempStr = "TrueType fonts as graphics"
                Case DMTT_DOWNLOAD  ' default for HP printers that use PCL
                    TempStr = "Downloads TrueType fonts as soft fonts"
                Case DMTT_SUBDEV    ' default for PostScript printers
                    TempStr = "Substitute device fonts for TrueType fonts"
                Case Else
                    TempStr = "UNDEFINED"
             End Select
             List1.AddItem "TrueType Option: " & TempStr
    
             ' Windows NT drivers often return COLOR from Monochrome printers
             If pDevMode.dmColor = DMCOLOR_MONOCHROME Then
                TempStr = "MONOCHROME"
             ElseIf pDevMode.dmColor = DMCOLOR_COLOR Then
                TempStr = "COLOR"
             Else
                TempStr = "UNDEFINED"
             End If
             List1.AddItem "Color or Monochrome: " & TempStr
    
             If pDevMode.dmScale = 0 Then
                TempStr = "NONE"
             Else
                TempStr = CStr(pDevMode.dmScale)
             End If
             List1.AddItem "Scale Factor: " & TempStr
    
            If pDevMode.dmFields And DM_COLLATE Then
                If pDevMode.dmCollate = DMCOLLATE_FALSE Then
                   TempStr = "Collating is supported, but turned off"
                ElseIf pDevMode.dmCollate = DMCOLLATE_TRUE Then
                   TempStr = "Collating is supported and turned on"
                End If
             Else
                TempStr = "Collating is unsupported"
             End If
             List1.AddItem TempStr        
             If pDevMode.dmFields And DM_DUPLEX Then
                If pDevMode.dmDuplex = DMDUP_SIMPLEX Then
                   TempStr = "Duplex is supported, but turned off (1)"
                ElseIf pDevMode.dmDuplex = DMDUP_VERTICAL Then
                   TempStr = "Duplex is set to VERTICAL (2)"
                ElseIf pDevMode.dmDuplex = DMDUP_HORIZONTAL Then
                   TempStr = "Duplex is set to HORIZONTAL (3)"
                Else
                   TempStr = "Duplex is set to undefined value of " & _
                      pDevMode.dmDuplex
                End If
             Else
                TempStr = "Duplex is unsupported"
             End If
             List1.AddItem TempStr
    
             List1.AddItem "Y Resolution: " & pDevMode.dmYResolution & " dpi"
             List1.AddItem "Copies: " & CStr(pDevMode.dmCopies)
             ' Add any other items of interest ...
    
             Call ClosePrinter(hPrinter)
             GetPrinterSettings = True
          Else
             GetPrinterSettings = False
          End If
          End Function
    
          Private Sub Command1_Click()
          If GetPrinterSettings(Printer.DeviceName, Printer.hdc) = False Then
             List1.AddItem "No Settings Retrieved!"
             MsgBox "Unable to retrieve Printer settings.", , "Failure"
          End If
          End Sub
    
    					
  4. 執行專案,然後按一下 Command1 上。目前的預設印表機設定值將顯示在清單方塊。

?考

若要尋找其他的常數,請搜尋上 DEVMODE 中任一個 Win32 程式設計師的 [參照] 或 [Microsoft 開發 o 人 h 員 ? 工 u 具 ? 網路 (MSDN) 程式庫光碟片]。

這篇文章中的資訊適用於:
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.0 Learning Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 32-Bit Enterprise Edition
關鍵字:?
kbmt kbapi kbhowto kbprint KB190218 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:190218? (http://support.microsoft.com/kb/190218/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。