2

私はwinformsアプリケーションを使用して、以下を使用して別のwinformsアプリケーションを開くことができました。

Rhino4.Application oRhino =(Rhino4.Application)Activator.CreateInstance(Type.GetTypeFromProgID( "Rhino4.Application"));

しかし、どうすれば閉鎖されているかどうかを確認できますか?ユーザーがアプリケーションを閉じたときに発生するイベントを作成することは可能ですか?

編集

Process[] pr = Process.GetProcessesByName("Rhino4");


                for (int i = 0; i < pr.Length; i++)
                {


                    if (pr[i].MainWindowTitle != null)
                    {
                        if (pr[i].MainWindowTitle.Length > 4)
                        {
                            if (pr[i].MainWindowTitle.Substring(0, 4) == "wall")
                            {
                                pr[i].Exited += new EventHandler(caseInfoMenu_Exited);

                            }
                        }
                    }

                }


void caseInfoMenu_Exited(object sender, EventArgs e)
        {
            MessageBox.Show("Window closed");
        }

このコードを使用してプロセスを特定することができました。しかし、プログラムを閉じてもExited-eventは発生しません。

4

3 に答える 3

3

これはおそらく最も洗練されたソリューションではありませんが、プロセスが存在するかどうかを確認して間接的にこれを実行し、これを繰り返し実行できます。もちろん、これはプロセスへのハンドルをまだ持っていない場合です。

void checkProcess()
{
    Process[] processes = Process.GetProcessesByName("NameOfProcess");
    if (processes.Length == 0)
    {
         // No such process
    }
    else
    {
         foreach (Process proc in processes)
         {
            // do something with proc
         }
    }
}

編集:アブドゥルの答えとあなた自身の質問の投稿を読んだ後のこれに関するいくつかの考え。これは決して答えではありませんが、おそらくそれはあなたの探求に役立つかもしれません。

まず、Activator.CreateInstanceは、指定したオブジェクトタイプに最適なコンストラクターを呼び出し、そのオブジェクトへのハンドルを返します。スレッド/プロセス自体を作成するため、それらについての知識はありません。リストに表示される(9)プロセスは、おそらくRheno4クラス自体によって作成されています。これについての議論がここにあります

次に、msdnによると Exitedイベントが正しく機能するためのプロセスが作成されたときに、EnableRaisingEventsプロパティをtrueに設定する必要があります。これは、プロセスがすでに作成された後にイベントを添付するとどうなるのか疑問に思います。

もちろん、CreateInstanceを呼び出す前後に、一致するすべてのプロセスを繰り返し処理して、作成されたRheno4のすべての新しいインスタンスを抽出することもできます。ただし、これは防弾ソリューションとはほど遠いものであり、他の誰かによって作成されたプロセスをフェッチしている、またはすべてのプロセスが取得されていない(他のオブジェクトの作成に遅延がある場合)というリスクがあります。ただし、ニーズによっては、これが当てはまる場合もあります。

別の考え。GetProcessesByNameから返されるプロセスには、豊富なプロパティのセットがあります。たぶん、これらを調べて、返されたプロセスの共通の分母を見つけることができます。私が調査し始めるのは、Threads、StartInfo、MainModuleです。

于 2011-06-14T12:29:45.313 に答える
2

Exitedイベントをキャッチするのはどうですか

myProcess.Exited += new EventHandler(myProcess_Exited);



private void myProcess_Exited(object sender, System.EventArgs e)
    {

        eventHandled = true;
        Console.WriteLine("Exit time:    {0}\r\n" +
            "Exit code:    {1}\r\nElapsed time: {2}", myProcess.ExitTime, myProcess.ExitCode, elapsedTime);
    }

ソースmsdn

于 2011-06-14T12:26:26.300 に答える
0

閉じた後にアプリケーションを再開したい場合:-実行中のプロセスをチェックし続けるWindowsサービスを作成する必要があると思います。閉じている場合は、アプリケーションを再起動します。

イベントに関する限り、Windowsアプリには「Closing」イベントと「Close」イベントがあり、ユーザーがアプリをシャットダウンすると発生します。

于 2011-06-14T12:25:35.567 に答える