Este ejemplo Delphi establece la impresora predeterminada de Windows por código

Estableciendo la impresora predeterminada de Windows programáticamente

Copyright © 2000 Ernesto De Spirito

LMD-Tools 6.1 - 300+ componentes para varias tareas de desarrollo!

Para establecer la impresora predeterminada de Windows por código primero tiene que asignar el valor de la clave device en la sección windows del archivo WIN.INI. Por ejemplo:

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

El valor lista el nombre de la impresora, el controlador y el puerto. Si no sabe que escribir allí, simplemente héchele una mirada a la sección devices de su archivo WIN.INI. Por ejemplo:

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

Después de actualizar el archivo WIN.INI debe enviar el mensaje WM_WININICHANGE (llamando a la API SendMessage) a todas las aplicaciones en ejecución para que se anoticien del cambio.

El siguiente ejemplo muestra como obtener las impresoras disponibles para mostrarlas en un cuadro de lista (ListBox), y luego como establecer la impresora seleccionada como la impresora predeterminada.

uses IniFiles, SysUtils, Messages;

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

var
  Devices: array of TDevice;
  DDevice: TDevice; // impresora predeterminada

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

  // Obtener la impresora predeterminada
  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);

  // Obtener la lista de impresoras
  DevList := TStringList.Create;
  WinIni.ReadSectionValues('Devices', DevList);

  // Guarda la lista de impresoras en un arreglo dinámico
  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);

    // Agregar la impresora a la lista
    ListBox1.Items.Add(Devices[i].Name
      + ' (' + Devices[i].Port + ')');

    // ¿Es la impresora predeterminada?
    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;  // Hacerla la impresora seleccionada
  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;
Help & Manual authoring tool