Um in VB-Anwendungen zu drucken, benutzen wir standardmäßig das Printer-Objekt. Die Auswahl und Einstellung des Drucker erfolgt hierbei wahlweise über das CommonDialog OCX (ComDlg32.ocx) oder - bei fortgeschrittenen Programmierern - über eine entsprechende Klasse, die die Funktionalität des o.g. OCX bereitstellt! Wie auch immer: hierbei wird nur das VB-interne Printer-Objekt eingestellt und/oder manipuliert. Die im OCX bereitgestellt Eigenschaft 'PrinterDefault' ist nicht zu empfehlen, da jede Einstellungsänderung auch am Standard-Drucker des Systems vorgenommen wird und somit das Druckverhalten anderer Anwendungen beeinflusst. Was aber, wenn wir über eine API-Funktion einen Druck anstoßen? Dann nützt uns die Einstellung des Printer-Objekts überhaupt nichts, da diese ja nicht auf unser Printer-Objekt schaut! In diesem Fall müssen die aktuelle Einstellungen temporär auf den Standarddrucker gesetzt werden. So zum Beispiel bei der API-Funktion: ShellExecute(hWnd, "print", [Dateiname], vbNullString, [Pfad], vbHide) Hier erfolgt der Ausdruck immer auf den aktuell festgelegten Standarddrucker. Wir möchten jedoch, dass der Ausdruck auf einen bestimmten voreingestellten Drucker erfolgt! Dies erreichen wir durch zwei relativ unbekannte API-Funktionen: GetDefaultPrinter und SetDefaultPrinter Über GetDefaultPrinter ermitteln wir den aktuellen Standard-Drucker und merken uns diesen temporär. Anschließend ändern wir über die SetDefaultPrinter-Funktion den Standarddrucker, starten die ShellExecute-Funktion, die dann ja autom. auf den "neuen" Standarddrucker druckt und setzen abschließend wieder unseren gemerkten Drucker als Standarddrucker. Fügen Sie nachfolgenden Code in ein Modul: ' Benötigte API-Funktionen Private Declare Function intSetDefaultPrinter Lib "winspool.drv" _ Alias "SetDefaultPrinterA" ( _ ByVal sPrinterName As String) As Long Private Declare Function intGetDefaultPrinter Lib "winspool.drv" _ Alias "GetDefaultPrinterA" ( _ ByVal sPrinterName As String, _ lPrinterNameBufferSize As Long) As Long Private Declare Function WaitForSingleObject Lib "kernel32" ( _ ByVal hHandle As Long, _ ByVal dwMilliseconds As Long) As Long Public Declare Function ShellExecute Lib "shell32.dll" _ Alias "ShellExecuteA" ( _ ByVal hWnd As Long, _ ByVal lpOperation As String, _ ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long ' Ermittelt den Standarddrucker auf System-Ebene Public Function getDefaultPrinter() As String Dim buffer As String * 128 Dim lbuf As Long lbuf = Len(buffer) If intGetDefaultPrinter(buffer, lbuf) Then getDefaultPrinter = Left$(buffer, lbuf - 1) Else getDefaultPrinter = vbNullString End If End Function ' Setzt den Standarddrucker auf System-Ebene ' gibt TRUE zurück, wenn Alles funktioniert hat Public Function setDefaultPrinter(ByVal PrinterName As String) As Boolean Dim prn As Printer For Each prn In Printers If prn.DeviceName = PrinterName Then setDefaultPrinter = CBool(intSetDefaultPrinter(PrinterName)) Exit For End If Next End Function ' Ewartet wird die Zeitangabe in Millisekunden! ' z.B. 1000 für 1 Sekunde Public Function Wait(ByVal mSek As Long) WaitForSingleObject -1, mSek End Function Folgender Code druckt nun ein Dokument auf den angegebenen Drucker, unabhängig vom aktuell eingestellten Systemdrucker: ' Druckt eine Datei mit der im System verknüpften Anwendung, ' wird keine Anwendung gefunden (Ergebnis = 31), so öffnet sich der ' Verknüpfungsdialog des Betriebssystems über den Shell-Ausdruck Public Function printFile(ByVal FileName As String, _ Optional ByVal prnDevName As Variant) As Boolean Dim path As String Dim stdPrinter As String If Not IsMissing(prnDevName) Then ' Standard-Drucker temporär merken stdPrinter = getDefaultPrinter ' Neuen Standarddrucker systemweit festlegen setDefaultPrinter prnDevName ' dem BS etwas Zeit geben ;-) DoEvents End If path = Left$(FileName, InStrRev(FileName, "\")) ' API-Druckbefehl absetzen If ShellExecute(hWnd, "print", FileName, vbNullString, path, vbHide) = 31 Then Shell ("rundll32.exe SHELL32,OpenAs_RunDLL " & FileName) Else printFile = True End If If Not IsMissing(prnDevName) Then ' Kurz warten, damit nicht autom. wieder der ' ursprüngliche Standard-Drucker verwendet wird Wait 2000 DoEvents ' Standard-Drucker wiederherstellen setDefaultPrinter stdPrinter End If End Function Dieser Tipp wurde bereits 21.486 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
sevZIP40 Pro DLL Zippen und Unzippen wie die Profis! Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Tipp des Monats April 2024 Skyfloy Chart von Microsoft und dazu noch gratis Tutorial für Microsoft Chart Controls für Microsoft .NET Framework 3.5 TOP Entwickler-Paket TOP-Preis!! Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR... |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |