![]() |
Beliebiges Dokument über Fremdanwendung ausdrucken
Ich nutze folgende, zum Teil hier aus dem Forum zusammengezimmerte, Klass, um den Standarddrucker auf einem Rechner auszulesen und auch zu setzen, beides über die Eigenschaft DefaultPrinterName.
Delphi-Quellcode:
Sinn der ganzen Sache ist es, beliebige Dokumente (PDF,DOC...) an einen von mir ausgewählten Drucker zu drucken, da die meisten Programme mittels ShellExecute nur an den Standarddrucker ausgeben.
unit PrinterSettings;
interface uses windows, sysutils, classes, dialogs, messages ; function GetDefaultPrinterA(prnName : PAnsiChar; var bufSize : DWORD ) : BOOL; stdcall; external 'winspool.drv' name 'GetDefaultPrinterA'; type TPrinterSettings = class private function getDefaultPrinterName: string; procedure SetDefaultPrinterName(const Value: string); public property DefaultPrinterName : string read GetDefaultPrinterName write SetDefaultPrinterName ; end ; var PS : TPrinterSettings ; implementation uses printers ; function TPrinterSettings.getDefaultPrinterName:string; var lprnName: PAnsiChar; lBufSize: DWord; begin GetMem(lprnName, 1000); try GetDefaultPrinterA(lprnName, lBufSize); Result := lprnName; finally FreeMem(lprnName); end; end; procedure TPrinterSettings.SetDefaultPrinterName(const Value: string); var Device: array[0..255] of char; Driver: array[0..255] of char; Port: array[0..255] of char; hDeviceMode: THandle; begin if Printer.Printers.IndexOf (Value) >= 0 then begin Printer.PrinterIndex := Printer.Printers.IndexOf (Value) ; Printer.GetPrinter(Device, Driver, Port, hDeviceMode); StrCat( Device, ','); StrCat( Device, Driver ); StrCat( Device, ','); StrCat( Device, Port ); WriteProfileString( 'windows', 'device', Device ); StrCopy( Device, 'windows' ); SendMessage( HWND_BROADCAST, WM_WININICHANGE, 0, longint( @Device )); sleep (2000) ; end else begin end ; end; initialization PS := TPrinterSettings.create ; finalization PS.free ; end.
Delphi-Quellcode:
Aber irgendwie kriegt die zu druckende Anwendung (z.B. der Acrobat Reader) diese Druckerwechsel aber nicht mit, da mein Delphi Programm weiter abläuft bevor Acrobat überhaupt das Dokument verarbeitet hat. In der Zwischenzeit habe ich dann wieder den alten Drucker zurückgestellt.
AlterDrucker := PS.DefaultPrinterName ;
PS.DefaultPrinterName := 'OKI' ; ShellExecute (H,'print',PChar(DokumentName),nil,PChar(extractFilePath(DokumettName)),SW_SHOWMINIMIZED) ; PS.DefaultPrinterName := AlterDrucker ; Ich hatte dann die Idee über ![]() aber der Versuch schlägt ebenfalls fehl... So, was kann ich noch tun, um nach erfolgreichem Druck den Standarddrucker wieder herzustellen? |
Re: Beliebiges Dokument über Fremdanwendung ausdrucken
![]() Wenn Du den Standarddrucker änderst, dann print aufrufst und nicht abwartest, bis print abgeschlossen ist, dann ist die Wahrscheinlichkeit sehr hoch, dass das zurücksetzen des Standarddruckers in deiner Anwendung noch vor dem Druck des Dokuments erfolgt, und du somit nix erreicht hast. Wie hast Du denn ShellExecuteAndWait aufgerufen??? |
Re: Beliebiges Dokument über Fremdanwendung ausdrucken
Zitat:
Delphi-Quellcode:
Daran ist auch an sich nichts falsch. Bietet sich aber da noch ein anderes Problem, weil bei dem Print Befehl z.B. der Acrobat sich nach Beenden nicht automatisch schliesst. Und solange der Acrobat läuft, ist meine Anwendung blockiert.
ShellExecuteAndWaitA (H,'print',PChar(DokumentName),nil,PChar(extractFilePath(DokumentName)),SW_SHOWMAXIMIZED,true) ;
PS: Das mit dem Drucker ändern klappt jetzt. Da der Wechsel über ein Sendmessage ans OS abläuft, war die Botschaft wohl noch nicht abgearbeitet bevor ich shellexecute aufrufe. Ein kleine Sleep(300) hat da geholfen. |
Re: Beliebiges Dokument über Fremdanwendung ausdrucken
Zum automatischen Schließen von Acrobat müsste das Flag "/t" mit übergeben werden.
Damit beendet Acrobat sich automatisch nach dem Drucken. |
Re: Beliebiges Dokument über Fremdanwendung ausdrucken
Das Ganze soll aber nicht nur mit Acrobat laufen, sondern mit jedem im System registrierten Filetyp.
ich hab mir jetzt mal so beholfen, dass ich den Standarddrucker umbiege, dann über ein einfaches ShellExecute ein beliebiges Dokument zum Drucken öffne. Was halt nun nicht geht, ist den Standarddrucker anschliessend wieder zurückzusetzen. |
Re: Beliebiges Dokument über Fremdanwendung ausdrucken
Hast Du das Problem, dass die Anwendung offen bleibt nur bei Acrobat, oder auch bei anderen???
|
Re: Beliebiges Dokument über Fremdanwendung ausdrucken
Wenn das Problem nur mit Acrobat besteht, dann müsstest du vor dem ShellExec folgenden Registry-Eintrag ändern:
alt: \HKEY_CLASSES_ROOT\.pdf\OpenWithList\AcroRd32.exe neu: \HKEY_CLASSES_ROOT\.pdf\OpenWithList\AcroRd32.exe /t Und nach dem Drucken wieder zurücksetzen... |
Re: Beliebiges Dokument über Fremdanwendung ausdrucken
Bislang nur bei Acrobat... Word läuft sauber.
Das hiesse für mich, ich könnte mit dem /t Schalter arbeiten... Nur klappt der nicht. Kann man diese ganzen Switches irgendwo lesen. Hab bislang nichts gefunden. |
Re: Beliebiges Dokument über Fremdanwendung ausdrucken
|
Re: Beliebiges Dokument über Fremdanwendung ausdrucken
Ich bin mittlerweilen zum Entschluss gekommen, dass ich wohl gar nicht über Acrobat drucken werden, sondern über gsprint. Dazu hätt ich auch noch ne Frage, aber dafür mach ich ein neues Thema auf... Danke für deine Hinweise.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz