2

私が現在サポートしようとしているアプリケーション (私の以前の作成) は完全に混乱しているため、別の実行可能ファイルとして拡張機能をプログラムし、それを起動して呼び出し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;

次に、(Win XP)、それをどのように説明するかを確認できますか?、アプリのフレームがタスクバーからジャンプして、アプリが画面に復元されているかのように動作しますが、実際には表示されません。ご覧のとおり、私は非常に絶望的で、app.restore、app.bringtofront、form.bringtofront、form.show ... を組み合わせていますが、何らかのアプリケーションが必要だと思います.show、activate、focus ... できませんそれらを見つけるようです。

また、なぜこれで十分ではないのですか?

application.Minimize;
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
Application.Restore;

編集

メイン フォームは です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;
4

1 に答える 1

6

ShowModalを使用すると、モーダルフォームを除くすべてのフォームのアプリケーションが無効になります。無効にしたウィンドウを自由に最小化、復元することはできません。sthを試してください。お気に入り;

  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;
于 2010-01-29T14:22:33.867 に答える