Drucker: Vorhandene Papierschächte ermitteln
Veröffentlicht: 03. Aug 2001 | Aktualisiert: 13. Jun 2004
Von Mathias Schiffer
Die Einstellung der PaperBin-Eigenschaft des Printer-Objekts ist eine haarige Angelegenheit: Sie ist darauf angewiesen, dass sich der Hersteller des verwendeten Druckertreibers an die Papierschachtnummern hält, die Visual Basic wie in der Produktdokumentation aufgelistet anbietet. Leider ist dies jedoch nicht die Regel, sondern eher die Ausnahme.
Um zu ermitteln, welche Papierschächte der verwendete Druckertreiber tatsächlich und unter welcher Schachtnummer anbietet, bietet Visual Basic selbst keine Möglichkeit. Abhilfe jedoch findet sich mit der API-Funktion DeviceCapabilities, die sowohl die entsprechenden Nummern als auch die für die Papierschächte vergebenen Klartextnamen ermitteln kann.
Der folgende Code ermittelt diese Informationen in einem zweidimensionalen Array PaperBins und gibt die Nummern und Namen der Papierschächte im Direktfenster aus:
' Prototypisierung der API-Funktion DeviceCapabilities Private Declare Function DeviceCapabilities _ Lib "winspool.drv" Alias "DeviceCapabilitiesA" ( _ ByVal lpDeviceName As String, _ ByVal lpPort As String, _ ByVal iIndex As Long, _ ByRef lpOutput As Any, _ ByVal dev As Long _ ) As Long ' Konstante für den Parameter iIndex Private Const DC_BINS As Long = 6& Private Const DC_BINNAMES As Long = 12& Private Sub ListPaperBins() Dim PaperBins() As String Dim lBinCount As Long Dim lBinNumbers() As Integer Dim sBinNames As String Dim lNullPos As Long Dim i As Long With Printer ' Anzahl unterstützter Papierschächte ermitteln: lBinCount = DeviceCapabilities(.DeviceName, .Port, _ DC_BINS, ByVal vbNullString, 0) ' Speicherplatz für die Rückgaben reservieren ReDim lBinNumbers(1 To lBinCount) sBinNames = Space$(24 * lBinCount) ' Nummern vorhandener Papierschächte abholen: DeviceCapabilities .DeviceName, .Port, DC_BINS, lBinNumbers(1), 0 ' Namen der vorhandenen Papierschächte abholen: DeviceCapabilities .DeviceName, .Port, DC_BINNAMES, ByVal sBinNames, 0 End With ' Schachtnummern und -namen extrahieren ' und im zweidimensionalen Array PaperBins ablegen: ReDim PaperBins(0 To lBinCount - 1, 0 To 1) For i = 1 To lBinCount ' Schachtnummer: PaperBins(i - 1, 0) = lBinNumbers(i) ' Schachtname: PaperBins(i - 1, 1) = Mid$(sBinNames, 24 * (i - 1) + 1, 24) ' Im Bedarfsfall das Stringende kürzen: lNullPos = InStr(PaperBins(i - 1, 1), vbNullChar) If lNullPos > 0 Then PaperBins(i - 1, 1) = Left$(PaperBins(i - 1, 1), lNullPos - 1) End If Next i ' Die gefundenen Daten in das Direktfenster ausgeben: Debug.Print "Vorhandene Papierschächte des Druckers " _ & Printer.DeviceName & " am Anschluss " _ & Printer.Port & " :" For i = LBound(PaperBins) To UBound(PaperBins) Debug.Print PaperBins(i, 0) & ": " & PaperBins(i, 1) Next i End Sub