Как прочитать/установить принтер по умолчанию?

Материал из DRKB


uses
  Printers, Messages;

function GetDefaultPrinter: string;
var
  ResStr: array[0..255] of Char;
begin
  GetProfileString('Windows', 'device', '', ResStr, 255);
  Result := StrPas(ResStr);
end;

procedure SetDefaultPrinter1(NewDefPrinter: string);
var
  ResStr: array[0..255] of Char;
begin
  StrPCopy(ResStr, NewdefPrinter);
  WriteProfileString('windows', 'device', ResStr);
  StrCopy(ResStr, 'windows');
  SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, Longint(@ResStr));
end;

procedure SetDefaultPrinter2(PrinterName: string);
var
  I: Integer;
  Device: PChar;
  Driver: PChar;
  Port: PChar;
  HdeviceMode: THandle;
  aPrinter: TPrinter;
begin
  Printer.PrinterIndex := -1;
  GetMem(Device, 255);
  GetMem(Driver, 255);
  GetMem(Port, 255);
  aPrinter := TPrinter.Create;
  try
    for I := 0 to Printer.Printers.Count - 1 do
    begin
      if Printer.Printers = PrinterName then
      begin
        aprinter.PrinterIndex := i;
        aPrinter.getprinter(device, driver, port, HdeviceMode);
        StrCat(Device, ',');
        StrCat(Device, Driver);
        StrCat(Device, Port);
        WriteProfileString('windows', 'device', Device);
        StrCopy(Device, 'windows');
        SendMessage(HWND_BROADCAST, WM_WININICHANGE,
          0, Longint(@Device));
      end;
    end;
  finally
    aPrinter.Free;
  end;
  FreeMem(Device, 255);
  FreeMem(Driver, 255);
  FreeMem(Port, 255);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  label1.Caption := GetDefaultPrinter2;
end;

// Fill the combobox with all available printers
procedure TForm1.FormCreate(Sender: TObject);
begin
  Combobox1.Items.Clear;
  Combobox1.Items.AddStrings(Printer.Printers);
end;

// Set the selected printer in the combobox as default printer
procedure TForm1.Button2Click(Sender: TObject);
begin
  SetDefaultPrinter(Combobox1.Text);
end;


Source: Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 03207


uses
  IniFiles;

procedure TForm1.Button1Click(Sender: TObject);
var
  WinIni: TIniFile;
  WinIniFileName: array [0..MAX_PATH] of Char;
  s: array [0..64] of Char;
begin
  GetWindowsDirectory(WinIniFileName, SizeOf(WinIniFileName));
  StrCat(WinIniFileName, '\win.ini');
  WinIni := TIniFile.Create(WinIniFileName);
  try
    WinIni.WriteString('windows','device', 'HP LaserJet Series II,HPPCL,LPT1:');
  finally
    WinIni.Free;
  end;
  StrCopy(S, 'windows');
  SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, LongInt(@S));
end;



Source: Взято с http://delphiworld.narod.ru
ID: 03208



Примечание от Vit
Поместил предыдущие ответы на сей вопрос и даже не знаю, а надо ли было? Изобретение велосипеда! В Дельфи есть предопределённый системный объект Printer типа TPrinter, в нём уже есть готовые свойства и методы как для чтения текущего принтера (и всех остальных принтеров тоже), так и для изменения текущего принтера на другой. Хочу добавить что реализация через API может несколько различается для разных версий Windows и простой код по изменению текущего принтера вовсе не факт будет работать стабильно на всех системах. Используйте объект Printer - это более надёжно и просто.


ID: 03209