【问题标题】:Hide process window with 'CreateProcess'使用“CreateProcess”隐藏进程窗口
【发布时间】:2014-11-06 09:26:21
【问题描述】:

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

 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 窗口。

【问题讨论】:

  • 是其他进程控制台还是 GUI 应用程序?您在退出代码上遇到有符号和无符号变量的问题。 CreateProcess 的第二个参数必须是可写的。为此使用 UniqueString。
  • 不要使用+ 合并标志CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS,必须使用or 运算符,如CREATE_NEW_PROCESS_GROUP or NORMAL_PRIORITY_CLASS。在这种情况下结果是相同的,但在许多情况下它不会。
  • 除了大卫所说的UniqueString(),你还应该使用PChar(ProgramName)而不是Addr(ProgramName[1])

标签: delphi delphi-xe5


【解决方案1】:

使用 dwFlags 和 STARTF_USESHOWWINDOW 来强制使用 wShowWindow

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

【讨论】:

  • Ups,@TLama 抱歉打开了我刚才看到的问题SW_HIDE,我没有意识到评论的更新。也许你应该添加它作为答案,我会删除我的。
  • STARTF_USESHOWWINDOW 仅适用于 GUI 应用程序,即使这样也只是一个提示,并不能 100% 保证该应用程序会真正尊重它,这取决于它如何实现其 UI。不过,使用 ShowWindow() 的标准 UI 将支持它。对于控制台应用,您可以在CreateProcess()dwCreationFlags 参数中使用CREATE_NO_WINDOW 标志。
猜你喜欢
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多