delphi - 使用 'CreateProcess' 隐藏进程窗口

标签 delphi delphi-xe5

我正在使用提供给我的程序来运行一个进程,但我希望该进程在后台运行而不显示窗口。调用的是

 ExecProcess(ProgPath, '', False);

函数是

function ExecProcess(ProgramName, WorkDir: string; Wait: boolean): integer;
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CreateOK: boolean;
  ExitCode: integer;
  dwExitCode: DWORD;
begin
  ExitCode := -1;

  FillChar(StartInfo, SizeOf(TStartupInfo), #0);
  FillChar(ProcInfo, SizeOf(TProcessInformation), #0);
  StartInfo.cb := SizeOf(TStartupInfo);

  if WorkDir <> '' then
  begin
    CreateOK := CreateProcess(nil, Addr(ProgramName[1]), nil, Addr(WorkDir[1]),
      false, CREATE_NEW_PROCESS_GROUP or NORMAL_PRIORITY_CLASS, nil, nil,
      StartInfo, ProcInfo);
  end
  else
  begin
    CreateOK := CreateProcess(nil, Addr(ProgramName[1]), nil, nil, false,
      CREATE_NEW_PROCESS_GROUP or NORMAL_PRIORITY_CLASS, nil, Addr(WorkDir[1]),
      StartInfo, ProcInfo);
  end;

  { check to see if successful }

  if CreateOK then
  begin
    // may or may not be needed. Usually wait for child processes
    if Wait then
    begin
      WaitForSingleObject(ProcInfo.hProcess, INFINITE);
      GetExitCodeProcess(ProcInfo.hProcess, dwExitCode);
      ExitCode := dwExitCode;
    end;
  end
  else
  begin
    ShowMessage('Unable to run ' + ProgramName);
  end;

  CloseHandle(ProcInfo.hProcess);
  CloseHandle(ProcInfo.hThread);

  Result := ExitCode;

end;

我尝试将 StartInfo.wShowWindow 属性与 SW_MINIMIZESW_FORCEMINIMIZESW_SHOWMINIMIZED 一起使用,但它是不工作。我可以看到该属性在调试器中正在更改,但这就是我现在所理解的。有人能指出问题出在哪里吗?

编辑:如果重要的话,我正在执行几个 Fortran 模块 (.exe),其参数将打开一个 CMD 窗口。

最佳答案

将 dwFlags 与 STARTF_USESHOWWINDOW 一起使用以强制使用 wShowWindow

StartInfo.wShowWindow := SW_HIDE;
StartInfo.dwFlags := STARTF_USESHOWWINDOW;

关于delphi - 使用 'CreateProcess' 隐藏进程窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26775794/

相关文章:

delphi - 如何选择处理器架构来使用 Delphi 安装 MSI

delphi - 在 Delphi 中实现 List Enumerator OfType<T>

delphi - 我应该引用字段或属性名称吗?

delphi - 为什么我在使用 Firemonkey Metropolis UI 应用程序时无法设置其他平台?

delphi - 将 ISO 3166-1 alpha-2 国家/地区代码转换为本地化的国家/地区名称

mysql - 在Delphi中找不到libmysql.dll和其他从ZeosLib连接到MYSQL的文件

delphi - ReportBuilder + cxGrid = 错误 : "canvas does not allow drawing"

delphi - 以可执行的免注册方式使用 COM 对象

android - 如何获取内置传感器的名称、制造商和序列号

delphi - Delphi秒表时间格式