德尔福:shellexecute和sw_hide

时间:2011-11-25 19:42:50

标签: delphi shellexecute

我正在尝试运行隐藏的应用程序,但应用程序表单仍然可见。

ShellExecute(Handle, nil, 'app.exe', nil, nil, SW_HIDE);

如何在Delphi中运行隐藏的应用程序?

2 个答案:

答案 0 :(得分:6)

我建议使用CreateProcess,因为它返回新启动的应用程序的进程ID,您可以使用它来获取窗口的句柄。这是我一直在使用的功能,也许你可以带走不必要的碎片并根据你的需要进行调整?

{$HINTS OFF}
{ .: ExecNewProcess :. }
function ExecNewProcess(const ProgramName: String;
  const StartHidden, WaitForInput: Boolean; out WndInfo: TWndInfo): Boolean;
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  R: TRect;
  SL: TStringList;

  {$REGION 'EnumProcess'}
  function EnumProcess(hHwnd: HWND; lParam: Integer): Boolean; stdcall;
  var
    WndInfo: PWndInfo;
    pid: DWORD;
  begin
    Result := True;

    WndInfo := PWndInfo(lParam);
    if (WndInfo = nil) or (hHwnd = 0) then
      exit;

    GetWindowThreadProcessId(hHwnd, pid);
    if (pid = WndInfo.PID) then
    begin
      if (WndInfo.WndHandle = 0) and (IsWindowVisible(hHwnd)) then
        WndInfo.WndHandle := hHwnd;
      //Result := False;
    end;
  end;
  {$ENDREGION}

begin
  Result := False;

  ZeroMemory(@StartInfo, SizeOf(TStartupInfo));
  ZeroMemory(@ProcInfo, SizeOf(TProcessInformation));

  StartInfo.cb := SizeOf(TStartupInfo);
  StartInfo.dwFlags := STARTF_USESTDHANDLES;
  if StartHidden then
  begin
    StartInfo.dwFlags := STARTF_USESHOWWINDOW or StartInfo.dwFlags;
    StartInfo.wShowWindow := SW_SHOWMINNOACTIVE;
  end;

  Result := CreateProcess(PChar(ProgramName), nil, nil, nil, False, 0, nil,
    nil, StartInfo, ProcInfo);
  try
    if Result then
    begin
      WndInfo.WndHandle := 0;
      WndInfo.PID := ProcInfo.dwProcessId;

      if WaitForInput then
        WaitForInputIdle(ProcInfo.hProcess, INFINITE);

      EnumWindows(@EnumProcess, Integer(@WndInfo));
      if (WndInfo.WndHandle <> 0) then
      begin
        if (StartHidden) then
          ShowWindow(WndInfo.WndHandle, SW_HIDE);
        Windows.GetWindowRect(WndInfo.WndHandle, R);

        WndInfo.Width := R.Right - R.Left;
        WndInfo.Height := R.Bottom - R.Top;
      end;
    end;
  finally
    CloseHandle(ProcInfo.hProcess);
    CloseHandle(ProcInfo.hThread);
  end;
end;
{$HINTS ON}

答案 1 :(得分:2)

你可以在这里阅读

http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153%28v=vs.85%29.aspx

由应用程序决定如何处理SW_HIDE。因此,就我所见,应用程序必须获取消息并隐藏自己...