Application.Restore没让我到达以前的位置,为什么?

Pet*_*háč 2 forms delphi restore delphi-2009

我现在试图支持的应用程序(我以前的创建)是一个完整的混乱,所以我编写了一个扩展它作为一个单独的可执行文件,然后我启动,调用application.minimize;WaitForSingleObject(最近创建的过程).在那之后,我打电话application.restore让我回到我离开的地方.

application.Minimize;
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
Application.Restore;
Application.BringToFront;
BringToFront; //the topmost form which was used to launch the app
Show;
Run Code Online (Sandbox Code Playgroud)

我可以看到(Win XP),如何描述它?,应用程序的框架从任务栏跳起来,就好像应用程序正在将自身恢复到屏幕但实际上并没有显示.正如你所看到的,我非常绝望,并结合了app.restore,app.bringtofront,form.bringtofront,form.show ......但我认为我需要某种应用程序.显示,激活,聚焦......不能似乎找到了那些.

另外,为什么这还不够?

application.Minimize;
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
Application.Restore;
Run Code Online (Sandbox Code Playgroud)

编辑

主要形式是wsMaximized,此调用anotherform.showmodal;最终会尝试最小化应用程序,启动其他进程并还原应用程序.我认为诀窍在于最顶层形式的MODALity.

另一个(最顶层)表单的示例代码,显示为模态:

function ExecAndWait(const FileName, Params: string;
  WindowState: Word): Boolean;
var
  SUInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: string;
begin
  { Enclose filename in quotes to take care of
    long filenames with spaces. }
  CmdLine := '"' + FileName + '" ' + Params;
  FillChar(SUInfo, SizeOf(SUInfo), #0);
  with SUInfo do
  begin
    cb := SizeOf(SUInfo);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := WindowState;
  end;
  Result := CreateProcess(nil, PChar(CmdLine), nil, nil, False,
    CREATE_NEW_CONSOLE or
    NORMAL_PRIORITY_CLASS, nil,
    PChar(ExtractFilePath(FileName)),
    SUInfo, ProcInfo);
  { Wait for it to finish. }
  if Result then
  begin
    application.Minimize;
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    Application.Restore;
    Application.BringToFront;
  end;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  ExecAndWait('C:\Windows\system32\mspaint.exe' , '' , SW_NORMAL);
end;
Run Code Online (Sandbox Code Playgroud)

Ser*_*yuz 6

除模式窗体外,ShowModal会禁用应用程序的所有形式.您不能最小化,随意恢复禁用的窗口.试试吧 喜欢;

  if Result then
  begin
    EnableWindow(Application.MainForm.Handle, True);
    application.Minimize;
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    Application.Restore;
    EnableWindow(Application.MainForm.Handle, False);
    Application.BringToFront;
  end;
Run Code Online (Sandbox Code Playgroud)