質問する質問する
 

回答済みProcess.Exitedイベントについて

  • 2009年10月27日 12:29ES_MC ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     

    こんにちは。

    起動した別プロセスの終了イベントを拾いたいのですがうまくいきません。
    プロセスを起動した後、すぐにProcess.Exitedイベントが発生してしまいます。
    原因が思い当たらず、質問させて頂きました。
    よろしくお願いします。

    過去のスレッドを参照して、以下のようなソースを組んでみました。

        Dim proc As System.Diagnostics.Process

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            proc = New System.Diagnostics.Process()
            proc.StartInfo.FileName = "\Windows\pimg.exe"
        End Sub

        Private Sub Button2_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            proc.EnableRaisingEvents = True
            AddHandler proc.Exited, AddressOf Process_Exited
            proc.Start()
            Label1.Text = "動作中"
        End Sub

        Private Sub Process_Exited(ByVal sender As System.Object, ByVal e As System.EventArgs)
            MessageBox.Show("終了")
        End Sub

    動作環境 T-01A(WindowsMobile6.1 Professional)、VB2005

回答

  • 2009年10月28日 9:59ES_MC ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     回答済み
    ありがとうございます。

    Process.WaitForExit()で待つことで、要件を満たすことが出来ました。
    (WordMobileではうまく動作しませんでしたが・・・)
    • 回答としてマークES_MC 2009年10月28日 9:59
    •  

すべての返信

  • 2009年10月27日 12:49mikiofuku ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     

    こんばんは。mikiofukuです。
    こちらで c#, CF 2.0, WM6.5 emuの環境で以下のコードを試してみましたが、プロセス終了時に正しくイベントが発生しました。
    実現しようとしていることが若干違うようですが、以下の手順で試してみてはいかがでしょうか。

      Process p = null;

      private void button1_Click(object sender, EventArgs e)
      {

       ProcessStartInfo info = new ProcessStartInfo(@"\windows\iexplore.exe", "");
       p = new Process();
       p.StartInfo = info;
       p.EnableRaisingEvents = true;
       p.Exited += new EventHandler(p_Exited);
       p.Start();
       
      }

      void p_Exited(object sender, EventArgs e)
      {
       MessageBox.Show("終了");
      }

  • 2009年10月28日 0:30ES_MC ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     
    返信ありがとうございます。

    提示して頂いたコードと、VBに変換したコードで正常に動作することを確認しました。
    最初に私が提示したコードでも動作を確認できました。

    タスクマネージャからタスクの終了をした場合に正常に動作しました。xボタンで終了(?)した場合がNGだったようです。

    エンドユーザーが操作するのはxボタンとなるので、xボタンがタップされた際の判定方法を探してみます。
    ありがとうございました。
  • 2009年10月28日 0:48mikiofuku ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     回答の候補
    おはようございます。
    コードの動作確認できて良かったです。

    WMでは、タスクバーの「x」ボタンはフォームを閉じる動作ではなく、フォームが最小化されるだけでプロセス自体は残ります。
    自分で作るソフトの判定であればForm.Deactivateイベントでどうにかなりどうですが、xボタンが押されたことの判定は難しいのではないでしょうか。

    起動したプロセスが終了したことを判定したいのであれば、別のスレッドを起動して、Process.Start()→Process.WaitForExit()でプロセスが終了するまで待つのが良いと思います。
    または一定期間起動しているプロセスを監視するとか。
    • 回答の候補に設定mikiofuku 2009年10月28日 0:48
    •  
  • 2009年10月28日 9:59ES_MC ユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダルユーザーのメダル
     回答済み
    ありがとうございます。

    Process.WaitForExit()で待つことで、要件を満たすことが出来ました。
    (WordMobileではうまく動作しませんでしたが・・・)
    • 回答としてマークES_MC 2009年10月28日 9:59
    •