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

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

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

Re[2]: 複数のプロセスの終了検知について


(過去ログ 148 を表示中)

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

■86647 / inTopicNo.1)  複数のプロセスの終了検知について
  
□投稿者/ ムーミン (1回)-(2018/02/25(Sun) 21:55:48)

分類:[.NET 全般] 

2018/02/26(Mon) 00:05:35 編集(投稿者)
環境
VB.net WindowsFormアプリ

ボタンAからbook1.xlsを開き、
ボタンBから別のbook2.xlsを開き
それぞれの終了を検知するプログラムを作りたいと思っています。
下記のとおり実装すると、
ボタンAでbook1.xlsを開く→Excelからbook1.xlsを閉じる場合や、
ボタンBでbook2.xlsを開く→Excelからbook2.xlsを閉じる場合はそれぞれの終了を正しく検知することは出来るのですが、
ボタンAでbook1.xlsを開く→ボタンBでbook2.xlsを開くとした時に、
なぜか閉じていないのにもかかわらずBook2.xlsの終了を検知してしまいます。
それぞれのExcelの終了を正しく検知するにはどのような実装が考えられるでしょうか?

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Try
            'Processオブジェクトを作成する
            Dim p As New System.Diagnostics.Process()
            '起動するファイルを指定する
            p.StartInfo.FileName = "C:\Users\test\Desktop\Book1.xls"
            'イベントハンドラがフォームを作成したスレッドで実行されるようにする
            p.SynchronizingObject = Me
            'イベントハンドラの追加
            AddHandler p.Exited, New EventHandler(AddressOf p_Exited)
            'プロセスが終了したときに Exited イベントを発生させる
            p.EnableRaisingEvents = True
            '起動する
            p.Start()
        Catch ex As Exception

        End Try

    End Sub
    Private Sub p_Exited(ByVal sender As Object, ByVal e As EventArgs)
        'プロセスが終了したときに実行される
        MessageBox.Show("終了しました。")
    End Sub

    'Excelの
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Try
            'Processオブジェクトを作成する
            Dim o As New System.Diagnostics.Process()
            '起動するファイルを指定する
            o.StartInfo.FileName = "C:\Users\test\Desktop\Book2.xls"
            'イベントハンドラがフォームを作成したスレッドで実行されるようにする
            o.SynchronizingObject = Me
            'イベントハンドラの追加
            AddHandler o.Exited, New EventHandler(AddressOf o_Exited2)
            'プロセスが終了したときに Exited イベントを発生させる
            o.EnableRaisingEvents = True
            '起動する
            o.Start()
        Catch ex As Exception

        End Try

    End Sub
    Private Sub o_Exited2(ByVal sender As Object, ByVal e As EventArgs)
        'プロセスが終了したときに実行される
        MessageBox.Show("終了しました。")
    End Sub
End Class

引用返信 編集キー/
■86650 / inTopicNo.2)  Re[1]: 複数のプロセスの終了検知について
□投稿者/ 魔界の仮面弁士 (1576回)-(2018/02/25(Sun) 23:52:05)
No86647 (ムーミン さん) に返信
> ボタンAからbook1.xlsを開き、
> ボタンBから別のbook2.xlsを開き
xlsx ではなく xls なのですね。(どっちでも良いですが)


> それぞれの終了を検知するプログラムを作りたいと思っています。

タスクマネージャーの詳細タブで、起動中の Excel.exe の数を数えてみてください。

book1.xls と book2.xls を起動しただけでは、Excel.exe は 1 つしか
起動していないのではないでしょうか?
https://www.ka-net.org/blog/?p=7287



> それぞれのExcelの終了を正しく検知するにはどのような実装が考えられるでしょうか?
Process クラスを使うのではなく、Excel.Application のインスタンスを 2 つ起動するようにし、
Excel.Application クラスの WorkbookBeforeClose イベントを捕らえるようにしてみるとか。
(もしくは、Excel.Workbook クラスの BeforeClose イベント)
引用返信 編集キー/
■86665 / inTopicNo.3)  Re[2]: 複数のプロセスの終了検知について
□投稿者/ ムーミン (2回)-(2018/02/27(Tue) 06:40:00)
No86650 (魔界の仮面弁士 さん) に返信

早速の返信ありがとうございます。

> xlsx ではなく xls なのですね。(どっちでも良いですが)
はい、xlsです。

> タスクマネージャーの詳細タブで、起動中の Excel.exe の数を数えてみてください。
>
> book1.xls と book2.xls を起動しただけでは、Excel.exe は 1 つしか
> 起動していないのではないでしょうか?
> https://www.ka-net.org/blog/?p=7287
おっしゃる通り、1つしか上がっていません。

> Process クラスを使うのではなく、Excel.Application のインスタンスを 2 つ起動するようにし、
> Excel.Application クラスの WorkbookBeforeClose イベントを捕らえるようにしてみるとか。
> (もしくは、Excel.Workbook クラスの BeforeClose イベント)
Excel.Application クラスの WorkbookBeforeClose イベントで実装することで
期待通りに、終了を検知できるようになりました。

非常に助かりました。
ありがとうございました。


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -