VB.NETで外部アプリケーションを呼び出し、終了するまで再描画を停止せずに待機する方法

通常、VB.NETで外部アプリケーションを呼び出し、終了するまで待機させようとすると、呼び出し元プロセスが完全に待機状態となって
再描画すら抑制されてしまいます。

これを簡単に解決するためには、BackgroundWorker、ShowDialogを利用します。
以下のようなクラスを作成して、Runメソッドに実行ファイルパスを渡してやります。


Public Class ShellUtil

Public Shared Sub Run(ByVal pName As String)

Dim a As New DummyForm
a.pName = pName
a.ShowInTaskbar = False
a.StartPosition = FormStartPosition.Manual
a.Top = -1000
a.Width = 0
a.Height = 0
a.ShowDialog()

End Sub

Private Class DummyForm
Inherits System.Windows.Forms.Form

Public pName As String = ""
Private EndFlg As Boolean = False

Private Sub DummyForm_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
Dim b As New System.ComponentModel.BackgroundWorker
AddHandler b.DoWork, AddressOf DoWork
b.RunWorkerAsync()
Dim Timer1 As New Timer
AddHandler Timer1.Tick, AddressOf Timer1_Tick
Timer1.Interval = 100
Timer1.Enabled = True
End Sub

Private Sub DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs)

Shell(pName, AppWinStyle.NormalFocus, True)
Me.EndFlg = True

End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs)
If Me.EndFlg = True Then
Me.Close()
End If
End Sub

End Class

End Class


【呼び出し側】


ShellUtil.Run("C:\Program Files\Microsoft Office\Office\EXCEL.exe")