起動中のプログラムの終了を知る

解決


TS  2006-01-28 08:13:51  No: 19855

自分のプログラムから起動させて、そのプログラムが終了するのを
待つという例はインターネット上に沢山あるのですが。
////
FDelphi の例
Var
   SI :TStartupInfo;
   PI :TProcessInformation;
Begin
  GetStartupInfo(SI);
  If Not CreateProcess('C:\Windows\Notepad.Exe', nil, nil, nil,
                       False,  CREATE_DEFAULT_ERROR_MODE,nil, nil, SI, PI) Then
     Raise Exception.Create('Exec Error ' + IntToStr(GetLastError));
  While WaitForSingleObject(PI.hProcess, 0) = WAIT_TIMEOUT Do
    Application.ProcessMessages;
{このループが抜けたら、起動したプログラムが終了している}
End;
////
EnumWndProcで現在実行中の指定のプログラムのハンドルを得て
PI.hProcessの所に当てはめて実行してみるのですが上手く行きません。
自分のプログラムから起動したプログラムでないと監視はできないのでしょうか、ご教授下さい。


TS  2006-01-30 02:01:11  No: 19856

質問の内容は過去の記事から見ても無理なようですが。
やりたい事はwindows.SetParent(Handle,H)で
他の特定のプログラムに貼り付かせたフォームが
貼り付かせたフォームのボタンで終了させているのですが
この場合は問題無いのですが、プログラム自身で終了した場合
後が制御不能になるためプログラムの終了を知りたかったのですが。
どうしたらいいのでしょうか、解決方法をご教授下さい。
ApplicationオブジェクトのOnActivateイベントも使用しましたが
終了をうまく捉えられませんでした。


Mr.XRAY  URL  2006-01-30 04:16:52  No: 19857

まず,最初の文章についてですが,
CreateProcessは文字通り,[プロセスを生成する]ですから,これがプロセスの
ハンドルを生成します.したがって,

>EnumWndProcで現在実行中の指定のプログラムのハンドルを得て
>PI.hProcessの所に当てはめて実行してみるのですが上手く行きません。
ということはできないでしょう.

純粋に既知の他アプリの終了を知るにには,タイマーイベントで,定期的に
そのアプリを監視するか,WH_CBTフックを使用する方法しか思いつきません.
WH_CBTなら,終了を検出することも,終了を阻止することも可能です.


TS  2006-01-30 06:46:18  No: 19858

Mr.XRAYさん毎回ありがとうございます。
今WH_CBTで検索をかけたら最近の事例で同様な事例が出ていました。
「他のアプリの終了を知るには」
これもMr.XRAYさんが回答されていました。
Mr.XRAYさんのホームページのサンプルプログラムも確認しました。
Application.OnIdleを使ってGetForegroundWindowで現在使用の
プログラムのハンドルと比較するプログラムを作ったのですか
今イチでした。上記を参考にさせていただきます。
いつもつまずいてばかりで、くたびれますが。
教えていただいて、助かります、又何かあると思いますので
又、宜しくお願いします。


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

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






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