他アプリケーション起動後の呼び出し元フォームの位置


  2005-12-12 22:37:21  No: 19210

呼び出し元アプリケーションAから他のアプリケーションBを
CreateProcessで起動し、WaitForSingleObjectで終了を待っています。
AはBの起動中に操作されては困るので、CreateProcess前にフォームのEnableをFalseに設定し、
Bの終了を待ってからEnableをTrueに設定しています。

そこで問題なのですが、呼び出し元フォームがモーダルで表示されている場合、
そこで上記方法の他アプリケーション呼び出しを行うと、呼び出し元フォームに戻ってきたときに、
他のウィンドウ(エクスプローラー等)があると、その後ろに隠れてしまいます。
呼び出し元フォームがモーダル表示でなければ問題はありません。

モーダル表示から他アプリケーションを起動して、戻ってきた場合に他のウィンドウに隠れなくする方法は
ありますでしょうか。

■ ソース
var
   UsSI: TStartupInfo;
   UsPI: TprocessInformation;
begin
  try
    GetStartupInfo(UsSI);
    if not CreateProcess(PChar(TBitBtn(Sender).Name + '.EXE'), nil, nil, nil, False,
                         CREATE_DEFAULT_ERROR_MODE, nil, nil, UsSI,UsPI) then
    begin
      Raise Exception.Create(TBitBtn(Sender).Name + '.EXE' + 'を起動できません');
      Exit;
    end;

    FNYU2010_F2.Enabled := False;

    while WaitForSingleObject(UsPI.hProcess, 1000) = WAIT_TIMEOUT do
    begin
      Application.ProcessMessages;
    end;

    FNYU2010_F2.Enabled := True;
    FNYU2010_F2.Show;
  finally
    CloseHandle(UsPI.hProcess);
    CloseHandle(UsPI.hThread);
  end;
end;

ちなみに、フォームのコントロールをループで回して、Enableをコントロールする方法だと隠れませんでした。


どやさ  2005-12-14 01:38:24  No: 19211

戻ったときに強制的に上に持っていけばいいだけのことです。


どやさ  2005-12-20 03:57:08  No: 19212

返事がないみたいですね・・・

FormStyle が fsStayOnTopの場合元に戻すのに
RestoreTopMosts で復元します。

強制的に前面に持ってくるなら
SetWindowPos 等を使って前面に持ってきてください。


  2006-01-18 02:32:38  No: 19213

こんにちは、書き込んでいただいた方法を試してみましたが、
表示は最前面にくるのですが、フォーカスが他のウィンドウにあるようです。

どやささんには返事が遅くなってしまって本当に申し訳ありませんでした。
仕事の関係で、掲示板を閲覧する機会を失っておりまして...
これからもよろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加