Я пытаюсь изменить принтер по умолчанию в событии при изменении поля со списком, в котором указан индекс принтера. Я использую «Принтеры», чтобы получить индекс принтера, но фактическая печать выполняется с помощью проприетарного кода печати, который позволяет напрямую печатать в формате PDF и упростить макет страницы. Я пытаюсь использовать приведенный ниже код для замены принтера по умолчанию, и затем мой код печати будет распечатан на этом принтере. Однако программа перестает отвечать на запросы без каких-либо ошибок или программ, не отвечающих на сообщения при выполнении этой строки кода:
SendMessage( HWND_BROADCAST, WM_WININICHANGE, 0,LongInt(cs1));
Вот полная функция.
function TMainFrm.SetDefaultPrinter(const PrinterName: string): boolean;
// Printername is bv: '\\MYPRINTER\HP5-k'
var
s2 : string;
dum1 : Pchar;
xx, qq : integer;
const
cs1 : pchar = 'Windows';
cs2 : pchar = 'Device';
cs3 : pchar = 'Devices';
cs4 : pchar = #0;
begin
xx := 254;
GetMem( dum1, xx);
Result := False;
try
qq := GetProfileString( cs3, pchar( PrinterName ), #0, dum1, xx);
if (qq > 0) and (trim( strpas( dum1 )) <> '') then
begin
s2 := PrinterName + ',' + strpas( dum1 );
while GetProfileString( cs1, cs2, cs4, dum1, xx) > 0 do
WriteProfileString( cs1, cs2, #0);
WriteProfileString( cs1, cs2, pchar( s2 ));
case Win32Platform of
VER_PLATFORM_WIN32_NT :
SendMessage( HWND_BROADCAST, WM_WININICHANGE, 0,LongInt(cs1));
VER_PLATFORM_WIN32_WINDOWS :
SendMessage( HWND_BROADCAST, WM_SETTINGCHANGE, 0,LongInt(cs1));
end; { case }
Result := True;
end;
finally
FreeMem( dum1 );
end;
end;
У кого-нибудь есть какие-либо советы или лучший способ сделать это?
Как примечание стороны, это не моя функция. Это кусок кода, который я выбрал во время поиска решения моей проблемы.
Еще немного информации:
Задание на печать - это фактически PDF-файл, печатаемый с использованием
ShellExecute(Application.Handle, 'print', PChar(sPath), nil, nil, SW_HIDE);
Цель состоит в том, чтобы изменить принтер по умолчанию на выбранный принтер, чтобы распечатать PDF-файл на желаемом принтере, а затем вернуть принтер к исходному значению по умолчанию при выходе из приложения