呼び出し元アプリケーション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をコントロールする方法だと隠れませんでした。
戻ったときに強制的に上に持っていけばいいだけのことです。
返事がないみたいですね・・・
FormStyle が fsStayOnTopの場合元に戻すのに
RestoreTopMosts で復元します。
強制的に前面に持ってくるなら
SetWindowPos 等を使って前面に持ってきてください。
こんにちは、書き込んでいただいた方法を試してみましたが、
表示は最前面にくるのですが、フォーカスが他のウィンドウにあるようです。
どやささんには返事が遅くなってしまって本当に申し訳ありませんでした。
仕事の関係で、掲示板を閲覧する機会を失っておりまして...
これからもよろしくお願いします。
ツイート | ![]() |