C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: アプリケーションの起動と終了を検知するには?


(過去ログ 32 を表示中)

[トピック内 13 記事 (1 - 13 表示)]  << 0 >>

■15337 / inTopicNo.1)  アプリケーションの起動と終了を検知するには?
  
□投稿者/ じゃかるた (81回)-(2008/03/11(Tue) 14:29:44)

分類:[C#] 

クライアントPCで何らかのアプリケーションが起動した場合と終了した場合にログを出力したいと考えています。
例えばExcelの起動時と終了時にExcel.exeのパスと開始時間、終了時間をログ出力するというように。

パスや開始時間はSystem.Diagnostics.Process.GetProcesses()で取得できることが分かったのですが、実行されたアプリケーション(画面表示のあるもの)の起動や終了を検知する方法が分かりません。

常駐させ一定時間ごとに巡回させる方法しか思いつきませんでしたが、これだと正確に検知することができません。
常駐するのは構わないのですが、CPUに負荷をかけないようにしたいと思っています。

ちなみにWindowsサービスは今回使用できません。
Windowsフォームで作成予定です。(スタートアップ時に起動させ、タスクバーにはShowInTaskbarで非表示にする予定です。)

よろしくお願いします。
引用返信 編集キー/
■15338 / inTopicNo.2)  Re[1]: アプリケーションの起動と終了を検知するには?
□投稿者/ いしだ (92回)-(2008/03/11(Tue) 15:05:30)
プロセスの終了イベントを設定すれば良いんじゃないでしょうか。

process.EnableRaisingEvents = true;
process.Exited += new EventHandler(Process_Exited);


private void Process_Exited(object sender, EventArgs e)
{
    MessageBox.Show("end!");
}

のようにしておけば、processの終了時にイベントが発生すると思います。

引用返信 編集キー/
■15339 / inTopicNo.3)  Re[2]: アプリケーションの起動と終了を検知するには?
□投稿者/ じゃかるた (82回)-(2008/03/11(Tue) 15:19:37)
No15338 (いしだ さん) に返信
> プロセスの終了イベントを設定すれば良いんじゃないでしょうか。
>
> process.EnableRaisingEvents = true;
> process.Exited += new EventHandler(Process_Exited);
>
>
> private void Process_Exited(object sender, EventArgs e)
> {
> MessageBox.Show("end!");
> }
>
> のようにしておけば、processの終了時にイベントが発生すると思います。

ありがとうございます。アプリケーションの終了イベントを検知することができました。

アプリケーションの起動を検知するには、巡回してプロセスの差分チェックするしかないのでしょうか?
引用返信 編集キー/
■15340 / inTopicNo.4)  Re[3]: アプリケーションの起動と終了を検知するには?
□投稿者/ じゃかるた (83回)-(2008/03/11(Tue) 15:27:39)
> アプリケーションの起動を検知するには、巡回してプロセスの差分チェックするしかないのでしょうか?

終了時にアプリケーションの開始時間と終了時間をロギングすればよいので、常に最新のプロセスを取得するようにしておけばよいかもです。
すいません。もう少し考えます。
引用返信 編集キー/
■15341 / inTopicNo.5)  Re[3]: アプリケーションの起動と終了を検知するには?
□投稿者/ やじゅ (232回)-(2008/03/11(Tue) 15:43:05)
2008/03/11(Tue) 16:15:04 編集(投稿者)
2008/03/11(Tue) 15:54:29 編集(投稿者)

No15339 (じゃかるた さん) に返信
> アプリケーションの起動を検知するには、巡回してプロセスの差分チェックするしかないのでしょうか?

CreateProcessをAPIフックするとかWH_SHELLをフックするとか

追記:
WMIがあるのか・・・、私は時代遅れだな。
引用返信 編集キー/
■15342 / inTopicNo.6)  Re[4]: アプリケーションの起動と終了を検知するには?
□投稿者/ Hongliang (254回)-(2008/03/11(Tue) 15:48:14)
WMI で
http://msdn2.microsoft.com/ja-jp/library/system.management.eventquery(VS.80).aspx
引用返信 編集キー/
■15344 / inTopicNo.7)  Re[5]: アプリケーションの起動と終了を検知するには?
□投稿者/ じゃかるた (84回)-(2008/03/11(Tue) 16:33:23)
No15342 (Hongliang さん) に返信
> WMI で
> http://msdn2.microsoft.com/ja-jp/library/system.management.eventquery(VS.80).aspx

現在、WMIなるものを勉強中です。
かなしいかな、使用方法が理解できていません^^;

改めて投稿します。
引用返信 編集キー/
■15359 / inTopicNo.8)  Re[6]: アプリケーションの起動と終了を検知するには?
□投稿者/ tyappi (1回)-(2008/03/11(Tue) 21:27:28)
tyappi さんの Web サイト
2008/03/11(Tue) 22:16:13 編集(投稿者)
2008/03/11(Tue) 22:16:06 編集(投稿者)

WMI でやっているのって結局 polling ですよ。中身は。
[追記]専用の event class を利用しない場合[/追記]

あと方法によっては取りこぼしの可能性がるので注意したほうがよいかと。
[追記]確実に取りこぼしが発生しないやり方が公開されていたと記憶しているんですが、見つからない。。。
やってることは確か MOF 作って専用の event class を登録しないといけなかったと思うので結構大変なはず。

確実にやりたいのであれば Win32_ProcessStartTrace, Win32_ProcessStopTrace あたりを使うことになると思います。
[/追記]
引用返信 編集キー/
■15418 / inTopicNo.9)  Re[6]: アプリケーションの起動と終了を検知するには?
□投稿者/ いしだ (93回)-(2008/03/12(Wed) 17:31:19)
サンプルが動かないという事でしょうか?

参照の追加で、
System.Management
を追加してない、とかはありませんかね?


引用返信 編集キー/
■15506 / inTopicNo.10)  Re[7]: アプリケーションの起動と終了を検知するには?
□投稿者/ じゃかるた (85回)-(2008/03/14(Fri) 10:40:00)
No15418 (いしだ さん) に返信
> サンプルが動かないという事でしょうか?
>
> 参照の追加で、
> System.Management
> を追加してない、とかはありませんかね?

返事が遅くなりました。
わけもわからずサンプルソースをそのままコピーしたので、他のアプリケーションを一回起動しログ出力しただけで実行終了していました。
現在はループ処理でアプリケーションごとの起動終了のログ出力ができています。(まだスレッドのsleepとか入れないとダメなんでしょう)

>あと方法によっては取りこぼしの可能性がるので注意したほうがよいかと。
>[追記]確実に取りこぼしが発生しないやり方が公開されていたと記憶しているんですが、見つからない。。。
>やってることは確か MOF 作って専用の event class を登録しないといけなかったと思うので結構大変なはず。

まだこれからいろいろテストしますが、取りこぼしは困ります。
sleep中のタイムラグ的な取りこぼし以外もあるのでしょうか?

引用返信 編集キー/
■15510 / inTopicNo.11)  Re[8]: アプリケーションの起動と終了を検知するには?
□投稿者/ じゃかるた (86回)-(2008/03/14(Fri) 11:27:58)
No15506 (じゃかるた さん) に返信
> ■No15418 (いしだ さん) に返信


>プロセスの終了イベントを設定すれば良いんじゃないでしょうか。

>process.EnableRaisingEvents = true;
>process.Exited += new EventHandler(Process_Exited);


>private void Process_Exited(object sender, EventArgs e)
>{
> MessageBox.Show("end!");
>}

Process_Exitedでprocessオブジェクトを参照することは可能でしょうか?
プロセスの名前や開始時間を上のコードでいくとMassage表示したいのですが。
引用返信 編集キー/
■15631 / inTopicNo.12)  Re[9]: アプリケーションの起動と終了を検知するには?
□投稿者/ じゃかるた (87回)-(2008/03/17(Mon) 15:37:26)
プロセスIDをHashTableでkey管理し、2秒おきにGetProcesでプロセスIDを取得しながらHashTableを更新することで、
とりあえず思っていたことができるようになりました。

ありがとうございました。


解決済み
引用返信 編集キー/
■15632 / inTopicNo.13)  Re[10]: アプリケーションの起動と終了を検知するには?
□投稿者/ じゃかるた (88回)-(2008/03/17(Mon) 15:38:18)
2008/03/17(Mon) 15:39:11 編集(投稿者)

誤記です。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -