Печать без диалогового окна
Имеется программа cablabel s3 lite для печати этикеток. В edit вводится штрих-код и при нажатии Enter файл отправляется на печать. Нужно, чтобы при отправке на печать не выводилось диалоговое окно печати и форма моей программы оставалась активной. Пытаюсь сделать с помощью функции ShellExecuteEx:
procedure TForm1.EditBarcodeKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
const
Dir = 'Labels\';
var
SEInfo: TShellExecuteInfo;
ExecuteFile: string;
begin
if Key = 13 then
begin
ExecuteFile := Dir + EditBarcode.Text + '.stc';
FillChar(SEInfo, SizeOf(SEInfo), 0);
SEInfo.cbSize := SizeOf(TShellExecuteInfo);
with SEInfo do
begin
fMask := SEE_MASK_NOCLOSEPROCESS;
Wnd := Application.Handle;
lpVerb := 'print';
lpFile := PChar(ExecuteFile);
nShow := SW_SHOWMINNOACTIVE;
end;
try
Win32Check(ShellExecuteEx(@SEInfo));
finally
EditBarcode.SetFocus;
EditBarcode.SelectAll;
end;
end;
end;
но безрезультатно. Подскажите в какую сторону двигаться.
Ответы (1 шт):
Используя ShellExecuteEx, Вы вызываете какую-то программу, ассоциированную в Windows с данным расширением и действием (verb), при этом не особо управляете процессом. Если Вы точно знаете, какую программу Вы хотите использовать и с какими аргументами (кажется, это Ваш случай), то используйте CreateProcess с подходящими аргументами. Вот образец:
procedure WinExecM(const ACmdLine: String; const ACmdShow: UINT = SW_SHOWNORMAL);
var
SI: TStartupInfo;
PI: TProcessInformation;
CmdLine: String;
begin
Assert(ACmdLine <> '');
CmdLine := ACmdLine;
UniqueString(CmdLine);
FillChar(SI, SizeOf(SI), 0);
FillChar(PI, SizeOf(PI), 0);
SI.cb := SizeOf(SI);
SI.dwFlags := STARTF_USESHOWWINDOW;
SI.wShowWindow := ACmdShow;
SetLastError(ERROR_INVALID_PARAMETER);
{$WARN SYMBOL_PLATFORM OFF}
Win32Check(
CreateProcess(nil, PChar(CmdLine), nil, nil, False,
CREATE_DEFAULT_ERROR_MODE {$IFDEF UNICODE}or CREATE_UNICODE_ENVIRONMENT{$ENDIF},
nil, nil, SI, PI)
);
{$WARN SYMBOL_PLATFORM ON}
CloseHandle(PI.hThread);
CloseHandle(PI.hProcess);
end;
Этот способ более качественный. И, естественно, используйте нужный SI.dwFlags и SI.wShowWindow, чтобы скрыть окно печати.