Einzelnen Beitrag anzeigen

Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#1

Beliebiges Dokument über Fremdanwendung ausdrucken

  Alt 18. Nov 2005, 13:10
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:
unit PrinterSettings;

interface
uses windows, sysutils, classes, dialogs, messages ;

function GetDefaultPrinterA(prnName : PAnsiChar; var bufSize : DWORD ) : BOOL; stdcall;
       external 'winspool.drvname '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.
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.
Delphi-Quellcode:
AlterDrucker := PS.DefaultPrinterName ;
PS.DefaultPrinterName := 'OKI' ;
ShellExecute (H,'print',PChar(DokumentName),nil,PChar(extractFilePath(DokumettName)),SW_SHOWMINIMIZED) ;
PS.DefaultPrinterName := AlterDrucker ;
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.

Ich hatte dann die Idee über ShellExecuteAndWaitA
aber der Versuch schlägt ebenfalls fehl...

So, was kann ich noch tun, um nach erfolgreichem Druck den Standarddrucker wieder herzustellen?
  Mit Zitat antworten Zitat