• 締切済み

終了するプロセス名の取得方法

使用言語は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); } 現在このようにしてウィンドウのタスクバー上に表示されるプロセスのタイトルを取得し、プロセスが終了したときに同じようにウィンドウのタイトルを表示しようとしました。 起動時のプロセスは取得できるのですが、終了時のプロセスが取得できません。 プロセスを全取得して、比較して終了したプロセスを判断すると終了時刻が取れないように思えるので、プロセスが終了するたびにイベントハンドらにとばすようにしたいです。ご存知の方がいましたよろしくお願いします。

みんなの回答

回答No.1

「System.Diagnostics.Processクラス」には、Exitedイベントがあるようですが、それではだめでしょうか? http://msdn.microsoft.com/ja-jp/library/system.diagnostics.process.exited.aspx

参考URL:
http://msdn.microsoft.com/ja-jp/library/system.diagnostics.process.exited.aspx

関連するQ&A

  • プロセスの情報取得

    vb.netで開発しています。 あるexe(仮にwatch_p.exeとします)のプロセスの情報(CPU時間)を取得し、一定時間以上(30分以上)だった場合強制終了するプログラムを作成しようとしています。 以下のようにCPU時間の取得する方法までは見えていますが、取得した 時間を比較する方法が見えていません。 忙しいことと思いますが、回答をお願いします。 Dim ps As System.Diagnostics.Process() = _ System.Diagnostics.Process.GetProcesses() '配列から1つずつ取り出す Dim p As System.Diagnostics.Process For Each p In ps Try If p.ProcessName="watch_p" then '合計プロセッサ時間 Console.WriteLine(p.TotalProcessorTime) End if Catch End Try Next p

  • 特定ユーザーのプロセス情報を取得するには

    こんにちは。 VB.NET 2003で、現在起動されている全プロセスから、 特定のユーザーが起動した ・プロセスID ・プロセス名称 の情報を取得する方法はありますでしょうか? System.Diagnostics.Process.GetProcessesで、 プロセス情報が取得できるので、 その中から、特定のユーザーの情報だけを洗い出そうとしたのですが、 ユーザー名に当たるプロパティが見つけられませんでした。 Process クラスには、ユーザー名は持っていないのでしょうか? よろしくお願いいたします。

  • 他のコンピュータのプロセスを取得

    VB2005Expressにて開発しています。 他のコンピュータで実行中のプロセスを取得したいと思っています。 Dim ps As System.Diagnostics.Process() = _ System.Diagnostics.Process.GetProcesses("プロセス名","192.168.XXX.XXX") で指定したコンピュータからプロセスは取得することは出来ました。 ただ、特定のコンピュータだけ「リモート コンピュータに接続できませんでした。」というエラーが出てしまいます。 プログラムの実行環境のID、パスワードと特定のコンピュータの IDとパスワードが異なっているのが原因だと思っています。 GetProcessesにIDとパスワードを設定してプロセスを取得することは 可能なのでしょうか。 ご存知の方がいらっしゃいましたらご教授下さい。 よろしくお願いします。

  • {}が・・・・。

    int i=1; if(i==0) { System.Console.WriteLine("0です。"); } else { System.Console.WriteLine("0ではありません"); } と勝手にこうなってしまいます。 個人的に if(i==0){ System.Console.WriteLine("0です。"); }else{ System.Console.WriteLine("0ではありません"); } としたいのですが、1つ1つ強引に変えていくしかないのでしょうか?

  • [C#]順序通りに実行されない

    次のC#のプログラムについて質問です。 //ここから using System; class Myclass { double[] point; string[] name; int nMax; public double this[string str] { get { for (int i = 0; i < nMax; i++) { if (str == name[i]) return point[i]; } return -1.0; } set { for (int i = 0; i < nMax; i++) { if (str == name[i]) { point[i] = value; break; } } } } public Myclass(int n) { point = new double[n]; name = new string[n]; nMax = n; setname(); } void setname() { for(int i=0;i<nMax;i++) { Console.Write("生徒名[{0}] = ",i); name[i] = Console.ReadLine(); } } } class ch08ex02 { public static void Main() { Console.WriteLine( "まずはじめに生徒数と、全員の名前入力が必要です"); Console.Write("生徒数--- "); string strn = Console.ReadLine(); Myclass mc = new Myclass(int.Parse(strn)); string ans, strp; Console.WriteLine("X入力で終了"); while (true) { Console.Write("点数を入力したい生徒名--- "); if ((ans = Console.ReadLine()) == "X") break; Console.Write("点数--- "); strp = Console.ReadLine(); mc[ans] = double.Parse(strp); } Console.WriteLine(); Console.WriteLine("X入力で終了"); while (true) { Console.Write("点数を知りたい生徒名--- "); ans = Console.ReadLine(); if (ans == "X") break; Console.WriteLine("{0}くんの点数は{1}点です", ans, mc[ans]); } } } //ここまで これはプロパティを使って生徒の点数を配列に格納したり参照したりするプログラムですが、実行するとMain()の    Console.Write("生徒数--- "); string strn = Console.ReadLine(); Myclass mc = new Myclass(int.Parse(strn)); string ans, strp; Console.WriteLine("X入力で終了");    while (true) { Console.Write("点数を入力したい生徒名--- "); if ((ans = Console.ReadLine()) == "X") break; Console.Write("点数--- "); strp = Console.ReadLine(); mc[ans] = double.Parse(strp); } の部分が思い通りに動いてくれません。 まずコンソールに「生徒数--- 」と表示されConsole.ReadLine()で数字を受け取り、その数からMyclassのインスタンスを作成し、「X入力で終了」と表示した後whileループで生徒名と点数の入力を受け付けるはずです。 しかしこれを実行すると「X入力で終了」と表示する前にwhileループに入り、ループを抜けた後「X入力で終了」と表示されます。 つまり順番が逆になっているわけです。 なぜこうなるかわかりません。 誰か教えてください、お願いします。

  • C#について

    using System; class AddressBook: PhoneBook { private string address; public AddressBook() : base() { address=""; } public void Input() { base.Input(); Console.Write("住所?"); string address=Console.ReadLine(); } public void Writes() { base.Write(); Console.WriteLine("住所:{0}",address); } } class kadai62 { public static void Main() { Console.Write("電話帳に入力する人数を入れてください:"); int n = int.Parse(Console.ReadLine()); AddressBook[] pb = new AddressBook[n]; int i; for (i = 0; i < pb.Length; i++) { pb[i] = new AddressBook(); Console.WriteLine("{0}番目を入力してください.", i+1); pb[i].Input(); } Console.WriteLine(); while(true) { Console.Write("どこから探しますか?[1:氏名,2:自宅電話,3:携帯電話,0:終了] "); int t = int.Parse(Console.ReadLine()); if (t == 0) break; Console.Write("探す文字列は?"); string s = Console.ReadLine(); for (i = 0; i < pb.Length; i++) { if (pb[i].Search(t, s)) pb[i].Writes(); } } } } このプログラムで public void Writes() { base.Write(); Console.WriteLine("住所:{0}",address); } のaddressが出力されません・・どうすれば 出力されますか?

  • {} が勝手に・・・・。

    int i=1; if(i==0) { System.Console.WriteLine("0です。"); } else { System.Console.WriteLine("0ではありません"); } と勝手にこうなってしまいます。 個人的に if(i==0){ System.Console.WriteLine("0です。"); }else{ System.Console.WriteLine("0ではありません"); } としたいのですが、1つ1つ強引に変えていくしかないのでしょうか? C#.NETです。 ※以前同じのを投稿しましたが、解決しなかったので再投稿しています。

  • Windows コマンドラインでの プロセスとサービスの一覧取得

    PCの管理を目的として、標題の件を実現させたいと考えております。 □プロセス tasklistコマンドを実行します。 但し、下記の形式で表示され、プロセス名以外も取得できてしまいます。プロセス名のみ取得するには、どのようにすればいいでしょうか。 awk '{ print $0 }' を windowsでできればいいのですが…。 mstsc.exe 5492 Console 0 8,560 K cmd.exe 2080 Console 0 3,072 K tasklist.exe 5940 Console 0 4,508 K □サービス sc query が希望しているものと近いです 取得したいのは、DisplayNameとStateです。grep使えればいいんですが…。 SERVICE_NAME: wscsvc DISPLAY_NAME: Security Center TYPE : 20 WIN32_SHARE_PROCESS STATE : 4 RUNNING 最終的には、一定期間をおいて取得したリストをdiffして、増えたサービス、プロセスを容易に見つけたいと思っています。 取得というか、文字列の整形の話になってしまいましたが、ご存じの方いらっしゃいましたら、よろしくお願いします。

  • 型の種類に関係なく配列かどうかを調べたい

    C# 2010 version 4.0を使用しています。 例えば以下のコードでは、 object o = new int[]{1, 2}; if (o is int[]) { Console.WriteLine("配列"); } 「o is int[]」 と調べれば良いのですが、 object o がstring型の配列だろうが object o = new string[]{“a”, “b”}; object o がdouble型の配列だろうが object o = new string[]{1.1, 1.2}; とにかく配列かどうかを調べるやり方なり関数はあるのでしょうか? やはり object o = new string[]{"a", "b"}; if (o is int[]) { Console.WriteLine("配列"); } else if (o is string[]) { Console.WriteLine("配列"); } このように調べる方法しかないのでしょうか?

  • WMIでのプロセスの起動・終了監視について

    WMIでのプロセスの起動・終了監視について ●環境 Microsoft VC++ 6.0 Windows XP Pro ●質問 http://mrxray.on.coocan.jp/Delphi/plSamples/902_WMI_ProcessCreateTerminate.htm の「04_プロセス(アプリケーション)の起動と終了を監視」を参考に、VCに置き換えて作成したのですが途中で詰まってしまいました。 get_Classによる取得までできて、プロセスの作成・終了までは分かるようになったのですが そのプロセスの情報が取得できません(プロセスIDや名前など)、参考にしたページ(Delphi)ではTargetInstanceから取得できるようなのですが、VCではそのプロパティ(?)が見つからず情報を取得出来ませんでした どうすれば、プロセスの情報を取得出来るのでしょうか? よろしくお願いします。 ●ソース _COM_SMARTPTR_TYPEDEF(ISWbemEventSource, __uuidof(ISWbemEventSource)); _COM_SMARTPTR_TYPEDEF(ISWbemObject, __uuidof(ISWbemObject)); _COM_SMARTPTR_TYPEDEF(ISWbemObjectPath, __uuidof(ISWbemObjectPath)); ISWbemEventSourcePtr SWbemEventSourcePtr; hResult = SWbemServices->ExecNotificationQuery(_bstr_t(L"SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"), _bstr_t(L"WQL"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &SWbemEventSourcePtr); while(TRUE) { ISWbemObjectPtr SWbemObjectPtr; hResult = SWbemEventSourcePtr->NextEvent(-1, &SWbemObjectPtr); CString ccc; { ISWbemObjectPathPtr SWbemObjectPathPtr; hResult = SWbemObjectPtr->get_Path_(&SWbemObjectPathPtr); CComBSTR ClassString; hResult = SWbemObjectPathPtr->get_Class(&ClassString); ccc = ClassString; } ■■■ここでプロセスに関する情報を取得したい■■■ if(ccc == "__InstanceCreationEvent"){ // プロセス作成 } else if(ccc == "__InstanceDeletionEvent"){ // プロセス終了 } }