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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.86647 の関連記事表示

<< 0 >>
■86647  複数のプロセスの終了検知について
□投稿者/ ムーミン -(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
親記事 /過去ログ148より / 関連記事表示
削除チェック/

■86650  Re[1]: 複数のプロセスの終了検知について
□投稿者/ 魔界の仮面弁士 -(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 イベント)
記事No.86647 のレス /過去ログ148より / 関連記事表示
削除チェック/

■86665  Re[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 イベントで実装することで
    期待通りに、終了を検知できるようになりました。

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

記事No.86647 のレス / END /過去ログ148より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -