Установите службы терминала принтера по умолчанию с помощью кода Delphi

У меня есть следующий код, который отлично работает в моем окне Win 7, т. е. отображает список доступных принтеров и изменяет выбранный принтер на принтер по умолчанию, перемещая «галочку» на правильный принтер. Однако, когда я запускаю это на своем терминальном сервере, он перечисляет принтеры в порядке, но когда я выбираю принтер, он полностью удаляет принтер по умолчанию (без галочки против любого принтера) - есть идеи?

uses Printers;

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

procedure SetDefaultPrinter(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 TfrmMain.FormCreate(Sender: TObject);
begin
//Fill the combobox with all available printers
Combobox1.Items.Clear;
Combobox1.Items.AddStrings(Printer.Printers);
// Get the Default Printer:
label1.Caption := Format('Default Printer: %s',[GetDefaultPrinter]);
end;

procedure TfrmMain.Button2Click(Sender: TObject);
begin
//Set the selected printer in the combobox as default printer
if Combobox1.Text <> '' then
SetDefaultPrinter(Combobox1.Text)
else ShowMessage('Choose a Printer first !');
end;

person user2455523    schedule 05.06.2013    source источник
comment
О какой галочке ты говоришь? Я не вижу никаких манипуляций с флажками в этом коде.   -  person Rob Kennedy    schedule 05.06.2013
comment
@RobKennedy: он имеет в виду галочку на значке принтера, которая указывает принтер по умолчанию ...   -  person whosrdaddy    schedule 05.06.2013
comment
Вы видели мой ответ?   -  person moskito-x    schedule 07.08.2013


Ответы (1)


Вы можете попробовать это со следующим:

procedure SetDefaultPrinter2(NewDefPrinter: 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[I] = NewDefPrinter 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));
        break;
      end;
    end;
  finally
    aPrinter.Free;
  end;
  FreeMem(Device, 255);
  FreeMem(Driver, 255);
  FreeMem(Port, 255);
end;

Надеюсь, это сработает для вас.

person moskito-x    schedule 05.06.2013