|
Estableciendo la impresora predeterminada de Windows programáticamente
Copyright © 2000 Ernesto
De Spirito
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;
|