使用'CreateProcess'隐藏流程窗口

use*_*658 6 delphi delphi-xe5

我正在使用提供给我的程序,它将运行一个进程,但我希望该进程在后台运行而不显示窗口.电话是

 ExecProcess(ProgPath, '', False);
Run Code Online (Sandbox Code Playgroud)

而且功能是

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;
Run Code Online (Sandbox Code Playgroud)

我曾尝试使用StartInfo.wShowWindow具有属性SW_MINIMIZE,SW_FORCEMINIMIZE并且SW_SHOWMINIMIZED但它不工作.我可以看到调试器中的属性正在发生变化,但就像我现在所理解的那样.有人能指出问题是什么吗?

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

bum*_*mmi 9

使用dwFlags STARTF_USESHOWWINDOW强制使用wShowWindow

StartInfo.wShowWindow := SW_HIDE;
StartInfo.dwFlags := STARTF_USESHOWWINDOW;
Run Code Online (Sandbox Code Playgroud)

  • `STARTF_USESHOWWINDOW`仅适用于GUI应用程序,即便如此,它只是一个提示,没有100%保证应用程序实际上会尊重它,具体取决于它如何实现其UI.但是,使用`ShowWindow()`的标准UI会尊重它.对于控制台应用程序,您可以在`CreateProcess()`的`dwCreationFlags`参数中使用`CREATE_NO_WINDOW`标志. (2认同)