Help & Manual authoring tool
This Delphi example sets the default printer of Windows by code

Setting Windows default printer programmatically

Copyright © 2000 Ernesto De Spirito

Storage Library - Save your app's configuration

To set the Windows default printer by code first you have to set the device entry in the windows section of the WIN.INI file. For example:

[windows]
device=Epson Stylus 200,EPS200,LPT1:

The value lists the name of the printer, the driver and the port. If you don't know what to write there, just take a look at the devices section of your WIN.INI file:

[Devices]
Epson Stylus 200=EPS200,LPT1:
Canon BJC-2000=CJRSTR,LPT1:

After updating the WIN.INI file you should broadcast the WM_WININICHANGE message (calling the SendMessage API) to all running applications so they get aware of the change.

The following source code example shows how to retrieve the available printers and display them in a ListBox, and then how to set the selected printer as the default printer:

uses IniFiles, SysUtils, Messages;

type
  TDevice = record
    Name, Driver, Port: string;
  end;

var
  Devices: array of TDevice;
  DDevice: TDevice; // current default printer

procedure TForm1.FormCreate(Sender: TObject);
var
  WinIni: TIniFile;
  DevList: TStringList;
  device: string;
  i, p: integer;
begin
  WinIni := TIniFile.Create('WIN.INI');

  // Get the current default printer
  device := WinIni.ReadString('windows', 'device', ',,');
  if device = '' then device := ',,';
  p := Pos(',', device);
  DDevice.Name := Copy(device, 1, p-1);
  device := Copy(device, p+1, Length(device)-p);
  p := Pos(',', device);
  DDevice.Driver := Copy(device, 1, p-1);
  DDevice.Port := Copy(device, p+1, Length(device)-p);

  // Get the printers list
  DevList := TStringList.Create;
  WinIni.ReadSectionValues('Devices', DevList);

  // Store the printers list in a dynamic array
  SetLength(Devices, DevList.Count);
  for i := 0 to DevList.Count - 1 do begin
    device := DevList[i];
    p := Pos('=', device);
    Devices[i].Name := Copy(device, 1, p-1);
    device := Copy(device, p+1, Length(device)-p);
    p := Pos(',', device);
    Devices[i].Driver := Copy(device, 1, p-1);
    Devices[i].Port := Copy(device, p+1, Length(device)-p);

		// Add the printer to the ListBox
    ListBox1.Items.Add(Devices[i].Name
      + ' (' + Devices[i].Port + ')');

    // Is the current default printer?
    if (CompareText(Devices[i].Name, DDevice.Name) = 0) and
       (CompareText(Devices[i].Driver, DDevice.Driver) = 0) and
       (CompareText(Devices[i].Port, DDevice.Port) = 0) then
      ListBox1.ItemIndex := i;  // Make it the selected printer
  end;
  WinIni.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  WinIni: TIniFile;
begin
  if ListBox1.ItemIndex = -1 then exit;
  DDevice := Devices[ListBox1.ItemIndex];
  WinIni := TIniFile.Create('WIN.INI');
  WinIni.WriteString('windows', 'device', DDevice.Name
    + ',' + DDevice.Driver + ',' + DDevice.Port);
  WinIni.Free;
  SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0,
    LPARAM(pchar('windows')));
end;

procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
  Button1Click(Sender);
end;
JfControls Library - for Delphi and C++ Builder
Copyright © 2000/2006 Ernesto De Spirito.   All rights reserved.