掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
フォーム (ID:45155)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
本題に入る前に… ・ 環境を書きましょう。 ・ 質問のタイトルをきちんと書きましょう。端折り過ぎです。 →例:起動した外部プログラムがメインフォームの裏に隠れないようにするには? ・ 提示するコードには明らかに余計な部分が無いようにすると分かりやすいです。 常に最前面(または常にメインフォームの前面かな?)とか、30秒問題とかあるようですが… とりあえず、他アプリを「常に最前面」にするのは難しいのと、UI的に好ましくないのでスルーします。 「裏に隠れてしまう」の再現条件はダブルクリックというより1.5クリック(クリック+マウスダウン) ですよね。これだと、新しく立ちあがるウインドウが最前面に出てこれないみたい? この状態で自アプリが前面に居座らないようするために各種Enabledでなんとかするのは難しいようです。 で、、、なんとなくSleep(100);を入れてみたら改善したような?? (テクノロジー不明) 以下、いくつか気になった点を修正、ついでとして勝手に自分好みにしてみたコードです。 なお、CreateProcess周辺はよく分かってませんので適当です。あしからず。 procedure TForm1.Button1Click(Sender: TObject); const // exeName = 'C:\EXE\\Auth.exe'; // ←なぜ \\ ? exeName = 'C:\WINDOWS\NOTEPAD.EXE'; var SI : TStartupInfo; PI : TProcessInformation; command : String; begin Self.Enabled := False; // まず最初にフォームをDisableにする Sleep(100); // ミソ? //Exe呼び出し // command := exeName; command := '"'+exeName+'"'; // 一応ダブルコーテーションで囲んでみる // command := command+' "C:\Program Files\Borland\Delphi6\readme.txt"'; // 引数も付けられる GetStartupInfo(SI); if Not CreateProcess(nil, PChar(command), nil, nil, False, CREATE_DEFAULT_ERROR_MODE, nil, nil, SI, PI) then Raise Exception.Create('Exec Error' + IntToStr(GetLastError)); //戻りを待つ try while WaitForSingleObject(PI.hProcess, 0) = WAIT_TIMEOUT do begin Application.ProcessMessages; Sleep(50); // 全力空回り(CPU100%)を防止! end; finally Self.Enabled := True; //ハンドルをクローズ CloseHandle(PI.hProcess); // 不測の事態が起きてもCloseHandleしたいならこの位置かと end; end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.