Drucker

Wie so oft bei der Verwendung von APIs, so stellt sich auch rund um den Drucker die Frage, wann API-Aufrufe überhaupt notwendig sind. Tatsächlich dürfte das eher selten der Fall sein. So kann z. B. in den meisten Applikationen einfach mit Application.ActivePrinter der aktuelle Standarddrucker ganz ohne API abgefragt und geändert werden. Eine Änderung wirkt sich nicht auf andere Anwendungen aus. Es handelt sich also sozusagen um den Standarddrucker der Applikation, der beim Starten der Anwendung mit dem Windows-Standarddrucker identisch ist. In Microsoft Access heißt es diese Eigenschaft Application.Printer, und mit der Printers-Auflistung gibt es auch noch eine Übersicht aller vorhandenen Drucker. Warum Microsoft diese Auflistung nicht auch in anderen Applikationen eingebaut hat, bleibt wohl deren Geheimnis.

Immerhin ist zumindest der Aufwand, in anderen Applikationen als Microsoft Access die Devicenamen der vorhandenen Drucker abzufragen, überschaubar und ohne API machbar. Die folgende Funktion schreibt die Devicenamen aller verfügbaren Drucker in einen öffentlichen Stringarray.

Public Printers() As String

Public Sub
FillPrinters() Dim objNetzwerk As Object Dim objPrinters As Object Dim i As Integer Set objNetzwerk = CreateObject("WScript.Network") Set objPrinters = objNetzwerk.EnumPrinterConnections ReDim Printers(0 To objPrinters.Count \ 2 - 1) For i = 0 To UBound(Printers) Printers(i) = objPrinters.Item(i * 2 + 1) 'Der Printbefehl dient natürlich nur zur Kontrolle: Debug.Print Printers(i) Next i Set objNetzwerk = Nothing Set objPrinters = Nothing End Sub

GetDefaultPrinter

Gibt den Windows-Standarddrucker zurück. Das kann sinnvoll sein, wenn man zuvor mit Application.ActivePrinter den Standarddrucker der Anwendung verändert hat.

#If VBA7 Then
    Private Declare PtrSafe Function GetDefaultPrinterA Lib "winspool.drv" _
        (ByVal pszBuffer As String, ByRef pcchBuffer As Long) As Boolean
#Else
    Private Declare Function GetDefaultPrinterA Lib "winspool.drv" _
        (ByVal pszBuffer As String, ByRef pcchBuffer As Long) As Boolean
#End If

Public Function
apiGetDefaultPrinter() As String Dim strResult As String Dim lngSize As Long lngSize = 255 strResult = String(lngSize, vbNullChar) If GetDefaultPrinterA(strResult, lngSize) Then apiGetDefaultPrinter = Replace(strResult, vbNullChar, "") End If End Function