Печать без диалогового окна

Имеется программа 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 шт):

Автор решения: taras

Используя 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, чтобы скрыть окно печати.

→ Ссылка