首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi: sw_hide执行和sw_hide

Delphi: sw_hide执行和sw_hide
EN

Stack Overflow用户
提问于 2011-11-26 03:42:50
回答 2查看 10.3K关注 0票数 1

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

代码语言:javascript
复制
ShellExecute(Handle, nil, 'app.exe', nil, nil, SW_HIDE);

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-26 03:50:49

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

代码语言:javascript
复制
{$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}
票数 6
EN

Stack Overflow用户

发布于 2011-11-26 04:11:17

你可以在这里读到

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8273588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档