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