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

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

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

Re[7]: 終了するプロセスの取得方法


(過去ログ 44 を表示中)

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

■23462 / inTopicNo.1)  終了するプロセスの取得方法
  
□投稿者/ 3232 (1回)-(2008/08/15(Fri) 14:37:24)

分類:[C#] 

よろしくお願いします

使用言語はC#です。

System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcesses();

for (int i = 0; i<= ps.Length-1 ; i++)
{
  if (ps[i].MainWindowTitle != string.Empty)
  {
    Console.WriteLine("ウィンドウタイトル:" + ps[i].MainWindowTitle);
    Console.WriteLine("起動時間:" + ps[i].StartTime);
  }
  try
  {
  ps[i].EnableRaisingEvents = true;
  ps[i].SynchronizingObject = this;
  ps[i].Exited += new EventHandler(p_Exited);

  if(ps[i].MainWindowTitle != string.Empty)
  {
    Console.WriteLine("ウィンドウタイトル: " + ps[i].MainWindowTitle);
    Console.WriteLine("終了時間:" + ps[i].ExitTime);
  }
}

現在このようにしてウィンドウのタスクバー上に表示されるプロセスのタイトルを取得し、プロセスが終了したときに同じようにウィンドウのタイトルを表示しようとしました。

起動時のプロセスは取得できるのですが、終了時のプロセスが取得できません。

プロセスを全取得して、比較して終了したプロセスを判断すると終了時刻が取れないように思えるので、プロセスが終了するたびにイベントハンドらにとばすようにしたいです。ご存知の方がいましたよろしくお願いします。
引用返信 編集キー/
■23465 / inTopicNo.2)  Re[1]: 終了するプロセスの取得方法
□投稿者/ ネタ好き未記入 (25回)-(2008/08/15(Fri) 14:43:44)
No23462 (3232 さん) に返信
Exited イベントをお試しあれ
引用返信 編集キー/
■23467 / inTopicNo.3)  Re[2]: 終了するプロセスの取得方法
□投稿者/ 3232 (3回)-(2008/08/15(Fri) 15:44:54)
No23465 (ネタ好き未記入 さん) に返信
> ■No23462 (3232 さん) に返信
> Exited イベントをお試しあれ

ネタ好き未記入さんありがとうございます。

イベントハンドラのsenderに簡略化されたプロセス名が入っていました。
ただ、プロセスの終了時刻を取れないのですがイベントハンドラが呼び出された時刻を記載しか無理でしょうか?
引用返信 編集キー/
■23469 / inTopicNo.4)  Re[3]: 終了するプロセスの取得方法
□投稿者/ 魔界の仮面弁士 (817回)-(2008/08/15(Fri) 15:59:50)
No23467 (3232 さん) に返信
>>Exited イベントをお試しあれ
> イベントハンドラのsenderに簡略化されたプロセス名が入っていました。
「プロセス名」? object sender 引数に String 型の値が入ってきたという意味でしょうか。
妙ですね。sender に入ってくるのは、この場合 (string ではなく) Process のハズなのですが…。


> ただ、プロセスの終了時刻を取れないのですがイベントハンドラが呼び出された時刻を記載しか無理でしょうか?
当方では、Exited イベントに下記のように書くことで取得されました。

Console.WriteLine( ((System.Diagnostics.Process)sender).ExitTime.ToString("yyyy-MM-dd HH:mm:ss.fff") );
引用返信 編集キー/
■23470 / inTopicNo.5)  Re[4]: 終了するプロセスの取得方法
□投稿者/ ネタ好き未記入 (27回)-(2008/08/15(Fri) 16:07:23)
3232 さん に返信
そのような場合はExitTimeプロパティを使用すればいいです。

引用返信 編集キー/
■23472 / inTopicNo.6)  Re[5]: 終了するプロセスの取得方法
□投稿者/ 3232 (4回)-(2008/08/15(Fri) 18:49:42)
魔界の仮面弁士さんありがとうございます。

System.Diagnostics.Process (POWERPNT)
System.Diagnostics.Process (notepad)
のようにsenderの中に入っていたので、ToStringで型変換して()内の値を取得しようとしました。
ただ、()の中に省略されていないプロセス名が入っていれば…という感じでした。


ネタ好き未記入さん&魔界の仮面弁士さんありがとうございます。

ExitTimeはイベントハンドラの中で使えばよかったんですね!


追加で質問なのですが、
()内の値をとる場合、例えばワードが2個開いていたらどちらが閉じたかわからないと思うので、
できればウィンドウのタイトル名も同時に取得したいのですが、どうすればいいでしょうか?
よろしくお願いします。
引用返信 編集キー/
■23473 / inTopicNo.7)  Re[6]: 終了するプロセスの取得方法
□投稿者/ 魔界の仮面弁士 (818回)-(2008/08/15(Fri) 19:00:09)
2008/08/15(Fri) 19:03:08 編集(投稿者)

No23472 (3232 さん) に返信
> ()内の値をとる場合、例えばワードが2個開いていたらどちらが閉じたかわからないと思うので、
> できればウィンドウのタイトル名も同時に取得したいのですが、どうすればいいでしょうか?

ご自身がループ内でやっていたのと同じことを、Exited イベントの中で行うだけでいけますよ。
つまり、
 System.Diagnostics.Process p = (System.Diagnostics.Process)sender;
 Console.WriteLine("ウィンドウタイトル:" + p.MainWindowTitle);
 Console.WriteLine("起動時間:" + p.StartTime.ToString("yyyy-MM-dd HH:mm:ss.fff") );
という感じです。

簡略化のために、上記ではキャスト結果を変数 p に代入してはいますが、
No23462 (3232 さん) がループ中に書かれていたコードや、
No23469 (私) がイベント中に書いたコード、そして上記は、
いずれも「Process インスタンスのプロパティを得ている」という点について、
まったく同等のコードですよね。
引用返信 編集キー/
■23474 / inTopicNo.8)  Re[7]: 終了するプロセスの取得方法
□投稿者/ 3232 (5回)-(2008/08/15(Fri) 19:30:12)
魔界の仮面弁士さんありがとうございます。

Exitedイベントの中で同じことをやれば取得できるんですね。
あまりわからずにExitedイベントを使っていました。
わかりやすく説明していただきありがとうございます。

私の質問を見てくださった皆様、特に魔界の仮面弁士さんとネタ好き未記入さんに感謝いたします。
ありがとうございました。
解決済み
引用返信 編集キー/
■23475 / inTopicNo.9)  Re[7]: 終了するプロセスの取得方法
□投稿者/ 渋木宏明(ひどり) (851回)-(2008/08/15(Fri) 19:35:22)
渋木宏明(ひどり) さんの Web サイト
> ご自身がループ内でやっていたのと同じことを、Exited イベントの中で行うだけでいけますよ。
> つまり、
>  System.Diagnostics.Process p = (System.Diagnostics.Process)sender;
>  Console.WriteLine("ウィンドウタイトル:" + p.MainWindowTitle);
>  Console.WriteLine("起動時間:" + p.StartTime.ToString("yyyy-MM-dd HH:mm:ss.fff") );
> という感じです。

Exited イベントって事後報告じゃないんですか?
プロセスが既に終了してしまっているのに、Process.MainWindowTitle を参照しても大丈夫なんですか?

それと、プロセス一覧を取得して Exited イベントのハンドラを仕掛けるまでの間に当該プロセスが終了してしまった場合、イージーなコードを書くと永遠に来ることのない Exited イベントを待ち続けるような気がします。

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -