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
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