Aus einer ACCESS-Anwendung heraus kann der Benutzer einen Bericht drucken - es stehen aber verschiedene Drucker zur Verfügung. Wie kann ich einen speziellen Drucker direkt ansteuern, ohne den Anwender über das bekannte Druckermenü „schicken“ zu müssen?
Die übliche Strategie ist, den Bericht für den Standarddrucker zu entwerfen und dann den Standarddrucker über die API umzusetzen, z.B. so:
Public Const HWND\_BROADCAST = &HFFFF
Public Const WM\_WININICHANGE = &H1A
Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long
Declare Function WriteProfileString Lib "kernel32" Alias "WriteProfileStringA" (ByVal lpszSection As String, ByVal lpszKeyName As String, ByVal lpszString As String) As Long
Public Function SetDefaultPrinter(PrName As String)
' Parameter: Druckername
' Rückgabewert: Erfolg der Aktion
Dim Buffer As String, RW, Tmp As String
On Error GoTo Er
Buffer = String(255, 0)
RW = GetProfileString(ByVal "devices", ByVal PrName, ByVal "", Buffer, Len(Buffer))
If RW 1 Then
SetDefaultPrinter = False
Exit Function
End If
' und mitteilen, daß sich die WIN.INI geändert hat
RW = SendMessage(HWND\_BROADCAST, WM\_WININICHANGE, 0&, 0&:wink:
SetDefaultPrinter = True
Ex:
Exit Function
Er:
MsgBox "SetDefaultPrinter: " & Err.Description
SetDefaultPrinter = False
Resume Ex
End Function
Super, danke, klappt perfekt - wenn ich den Namen des Standarddruckers weiss. Ich kenne aber nur den Spezialdrucker, die einzelnen Arbeitsplätze verwenden unterschiedliche Drucker. Ich möchte nun aber nach dem Senden an den Spezialdrucker die Einstellungen wieder zurücksetzen. Schwierig?
Matthias
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Dann musst du dir wohl den Namen des Druckers vorher merken:
Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" \_
(ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, \_
ByVal lpReturnedString As String, ByVal nSize As Long) As Long
Public Function GetDefaultPrinter()
' Rückgabewert: Standarddrucker
' (In der Form: Druckername,Treibername,Gerätename)
' Z.B. HP LaserJet III,HPPCL5MS,LPT1:
Dim Tmp As String, RW, Res
On Error GoTo Er
Res = ""
Tmp = String(256, 0)
RW = GetProfileString("Windows", "Device", "", Tmp, Len(Tmp))
If RW \> 0 Then Res = Mid(Tmp, 1, RW)
Ex:
GetDefaultPrinter = Res
Exit Function
Er:
MsgBox "GetDefaultPrinter: " & Err.Description
Resume Ex
End Function