Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Standarddrucker umstellen (https://www.delphipraxis.net/96369-standarddrucker-umstellen.html)

FriFra 23. Jul 2007 10:40


Standarddrucker umstellen
 
Ich abe schon eine Möglichkeit gefunden den standard Drucker umzustellen, allerdings bekommt dies die bettr Anwendung (nicht mein Programm ;) ) nicht mit...
Lt. Microsoft und auch lt. div. Beispielen im Internet würde es reichen eine WM_SETTINGCHANGED Message abzusenden, dies funktioniert jedoch nicht! Setze ich hingegen den Drucker von Hand um "bemerkt" das Prograqmm die Umstellung und druckt dann entsprechend auf den korrekten Drucker. Ich gehe also davon aus, dass der Explorer beim Aktivieren eines nuen Standarddruckers noch mindestens eine weitere Message abschickt, so dass auch die bettr. Anwendung etwas davon mitbekommt.

Reinhard Kern 23. Jul 2007 13:19

Re: Standarddrucker umstellen
 
Zitat:

Zitat von FriFra
Ich abe schon eine Möglichkeit gefunden den standard Drucker umzustellen, allerdings bekommt dies die bettr Anwendung (nicht mein Programm ;) ) nicht mit...
Lt. Microsoft und auch lt. div. Beispielen im Internet würde es reichen eine WM_SETTINGCHANGED Message abzusenden, dies funktioniert jedoch nicht! Setze ich hingegen den Drucker von Hand um "bemerkt" das Prograqmm die Umstellung und druckt dann entsprechend auf den korrekten Drucker. Ich gehe also davon aus, dass der Explorer beim Aktivieren eines nuen Standarddruckers noch mindestens eine weitere Message abschickt, so dass auch die bettr. Anwendung etwas davon mitbekommt.

Hast du es so gemacht wie hier beschrieben ? : http://support.microsoft.com/kb/246772

Gruss Reinhard

FriFra 23. Jul 2007 16:02

Re: Standarddrucker umstellen
 
Genau so habe ich es gemacht. Es scheint ein Timingproblem zu sein... Im Explorer (Drucker) sieht alles korrekt aus. Allerdings bekommt die Anwendung es halt nicht mit... Wenn ich es manuell umstelle klappt es Problemlos, deshalb glaube ich, dass hier einfach noch irgendeine Message gesendet werden muss....

Hansa 23. Jul 2007 19:18

Re: Standarddrucker umstellen
 
Du willst also den Drucker für jedes Programm umstellen ? Egal, ob eigenes, Word usw. ? Also den kompletten System-Standarddrucker oder wie ?

Jelly 23. Jul 2007 19:30

Re: Standarddrucker umstellen
 
Ich nutze hier diesen Code, und der funktioniert bei mir:

Delphi-Quellcode:
unit PrinterSettings;

interface
uses windows, sysutils, classes, 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;
begin
     try
        Result := Printer.Printers[Printers.Printer.PrinterIndex] ;
     except
        Result := '' ;
     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 (300) ;
  end else begin

  end ;
end;



initialization
   PS := TPrinterSettings.create ;
finalization
   PS.free ;
end.
Und wenn ich schon dabei bin, dieser Code kann dann auch noch interessant sein:
Delphi-Quellcode:
unit PrinterNamesAndTrays;

interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, winspool, printers ;

procedure GetPrnBinNames(PrnName : string ; BinList: TStrings; BinNrList : TStrings);
procedure GetPrnNames(PrnList: TStrings) ;


implementation


Type
  TBinName = Array [0..23] of Char;
  TBinNameArray = Array [1..High(Integer) div Sizeof( TBinName )] of
TBinName;
  PBinnameArray = ^TBinNameArray;
  TBinArray = Array [1..High(Integer) div Sizeof(Word)] of Word;
  PBinArray = ^TBinArray;

procedure GetPrnNames(PrnList: TStrings) ;
begin
     PrnList.assign (Printer.Printers) ;
end ;

procedure GetPrnBinNames(PrnName : string ; BinList: TStrings; BinNrList : TStrings);
Var
  Device, Driver, Port: Array [0..255] of Char;
  hDevMode: THandle;
  i, numBinNames, numBins, temp: Integer;
  pBinNames: PBinnameArray;
  pBins: PBinArray;
begin
//  Printer.PrinterIndex := -1;
  if PrnName = ''
  then Printer.PrinterIndex := Printer.PrinterIndex
  else Printer.PrinterIndex := Printer.Printers.IndexOf(PrnName) ;
  Printer.GetPrinter(Device, Driver, Port, hDevmode);

  numBinNames := Winspool.DeviceCapabilities(Device, Port, DC_BINNAMES, Nil, Nil);
    numBins := Winspool.DeviceCapabilities(Device, Port, DC_BINS, Nil, Nil);
    if (numBins <> numBinNames) then begin
     raise Exception.Create('DeviceCapabilities: unterschiedliche Anzahl und Namen!');
    end; // if

  if numBinNames > 0 then begin
    // pBins := nil;
    GetMem(pBinNames, numBinNames * Sizeof( TBinname));
    GetMem(pBins, numBins * Sizeof(Word));
    try
      Winspool.DeviceCapabilities(Device, Port, DC_BINNAMES, Pchar(pBinNames), nil);
      Winspool.DeviceCapabilities(Device, Port, DC_BINS, Pchar(pBins), nil);
      BinList.Clear();
      BinNrList.Clear ;
      for i:= 1 to numBinNames do begin
        temp := pBins^[i];
        BinList.AddObject( pBinNames^[i], TObject(temp)) ;
        BinNrList.AddObject( IntToStr(temp), TObject(temp)) ;

      end;
    finally
      FreeMem(pBinNames);
      if (pBins <> nil)
       then FreeMem(pBins);
    end;
  end; // if
end;

end.

Hansa 23. Jul 2007 21:09

Re: Standarddrucker umstellen
 
Zitat:

Zitat von FriFra
..Setze ich hingegen den Drucker von Hand um "bemerkt" das Prograqmm die Umstellung und druckt dann entsprechend auf den korrekten Drucker.

Nochmals, um welches Programm geht es ? Soll der Windows-Standarddrucker mit Hilfe von Delphi umgebogen werden, oder soll der für ein eigenes Programm festgelegt werden, ohne Windows zu beeinträchtigen ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz