Visual Basic .NET または Visual Basic 2005 を使用して別のアプリケーションを閉じる方法

文書翻訳 文書翻訳
文書番号: 305602 - 対象製品
この記事は、以前は次の ID で公開されていました: JP305602
すべて展開する | すべて折りたたむ

目次

概要

この資料では、アプリケーション内から別のアプリケーションを閉じる方法について説明します。また、アプリケーションのインスタンスが複数実行されている場合に、メモ帳など、別のアプリケーションの特定のインスタンスを閉じる方法についても説明します。

プログラミング ロジックの解説

変数の宣言

いくつかの変数を定義する必要があります。これらの変数は複数のメソッドで使用されるため、変数がスコープ内に存在するように、すべてのプロシージャの外部で変数を定義する必要があります。proc 変数は、個別のプロセス オブジェクトへの参照を保持し、processes は GetProcessByName メソッドによって返されるプロセス オブジェクトを保持する配列です。
Private proc As Process
Private processes() As Process
Private procName As String = "notepad"
				

アプリケーション インスタンスの一覧の取得

メモ帳の新しいインスタンスが作成されるたびに呼び出される関数は、以下のコードのようになります (このサンプルでは buildList という関数です)。このサンプルでは、ListView コントロールにプロセス情報が格納されます。ListView コントロールを生成するコードは、サンプル コード全体との一貫性を保つことのみを目的として含まれています。このコードの最も重要な部分は、Process クラスの GetProcessByName メソッドへの呼び出しです。このメソッドは Process オブジェクトの配列を返します。この配列は、以下のように For...Each ブロックを使用して繰り返し処理できます。
Dim itemAdd As ListViewItem
ListView1.Items.Clear()

processes = Process.GetProcessesByName(procName)

For Each proc In processes
    itemAdd = ListView1.Items.Add(proc.MainWindowTitle)
    itemAdd.SubItems.Add(proc.Id.ToString)
Next
				

アプリケーションの特定のインスタンスを閉じる

アプリケーションの複数のインスタンスが実行されているときに、1 つのインスタンスを閉じる場合は、それらのプロセスを区別する必要があります。以下のサンプルでは、Process オブジェクトの Id プロパティを使用して、プロセスを区別します。Id プロパティと MainWindowTitle プロパティ (Process オブジェクトの別のプロパティ) は ListView コントロールに格納されます。コードは、以下のように ListView コントロールで現在選択されている項目を取得して、Process クラスの GetProcessById メソッドを使用してプロセスへの参照を取得し、CloseMainWindow メソッドを呼び出してそのプロセスを閉じます。
Try
    Dim procID As Integer = _  
     System.Convert.ToInt32(ListView1.SelectedItems(0).SubItems(1).Text)
    Dim tempProc As Process = Process.GetProcessById(procID)
    tempProc.CloseMainWindow()
    tempProc.WaitForExit()
    buildList()
Catch
    MessageBox.Show("Please select a process in the ListView before clicking this button." + _
      " Or the Process may have been closed by somebody.")
    buildList()
End Try
				

アプリケーションのすべてのインスタンスを閉じる

特定のアプリケーションのすべてのインスタンスを閉じるのは、比較的容易です。以下のように GetProcessByName によって返される配列を移動し、プロセス オブジェクトごとに CloseMainWindow メソッドを呼び出します。
Try
  For Each proc In processes
    proc.CloseMainWindow()
    proc.WaitForExit()
  Next
  buildList()
Catch ex As System.NullReferenceException
  MessageBox.Show("No instances of Notepad running.")      
End Try
				

サンプル プロジェクトをビルドする

  1. Visual Studio .NET または Visual Studio 2005 で新しい Visual Basic Windows アプリケーションを開始します。
  2. デフォルトのフォーム Form1.vb を右クリックし、[コードの表示] をクリックします。
  3. コード ウィンドウ内に存在するコードを以下のコードに置き換えます。
    Option Strict On
    Option Explicit On 
    
    Public Class Form1
      Inherits System.Windows.Forms.Form
    
    #Region " Windows Form Designer generated code "
    
      Public Sub New()
        MyBase.New()
    
        'This call is required by the Windows Form Designer.
        InitializeComponent()
    
        'Add any initialization after the InitializeComponent() call.
    
      End Sub
    
      'Form overrides dispose to clean up the component list.
      Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
          If Not (components Is Nothing) Then
            components.Dispose()
          End If
        End If
        MyBase.Dispose(disposing)
      End Sub
      Friend WithEvents btnLaunch1 As System.Windows.Forms.Button
      Friend WithEvents ColumnHeader1 As System.Windows.Forms.ColumnHeader
      Friend WithEvents ColumnHeader2 As System.Windows.Forms.ColumnHeader
      Friend WithEvents ListView1 As System.Windows.Forms.ListView
      Friend WithEvents btnCloseAll As System.Windows.Forms.Button
      Friend WithEvents btnClose1 As System.Windows.Forms.Button
    
      'Required by the Windows Form Designer.
      Private components As System.ComponentModel.Container
    
      'NOTE: The following procedure is required by the Windows Form Designer
      'It can be modified by using the Windows Form Designer.  
      'Do not modify it by using the code editor.
      <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.btnClose1 = New System.Windows.Forms.Button()
        Me.ListView1 = New System.Windows.Forms.ListView()
        Me.ColumnHeader1 = New System.Windows.Forms.ColumnHeader()
        Me.ColumnHeader2 = New System.Windows.Forms.ColumnHeader()
        Me.btnCloseAll = New System.Windows.Forms.Button()
        Me.btnLaunch1 = New System.Windows.Forms.Button()
        Me.SuspendLayout()
        '
        'btnClose1
        '
        Me.btnClose1.Location = New System.Drawing.Point(160, 176)
        Me.btnClose1.Name = "btnClose1"
        Me.btnClose1.Size = New System.Drawing.Size(112, 32)
        Me.btnClose1.TabIndex = 4
        Me.btnClose1.Text = "Close Selected Process"
        '
        'ListView1
        '
        Me.ListView1.Columns.AddRange(New System.Windows.Forms.ColumnHeader() {Me.ColumnHeader1, Me.ColumnHeader2})
        Me.ListView1.Location = New System.Drawing.Point(22, 8)
        Me.ListView1.MultiSelect = False
        Me.ListView1.Name = "ListView1"
        Me.ListView1.Size = New System.Drawing.Size(250, 152)
        Me.ListView1.TabIndex = 7
        Me.ListView1.View = System.Windows.Forms.View.Details
        '
        'ColumnHeader1
        '
        Me.ColumnHeader1.Text = "Window Title"
        Me.ColumnHeader1.Width = 160
        '
        'ColumnHeader2
        '
        Me.ColumnHeader2.Text = "Process ID"
        Me.ColumnHeader2.Width = 85
        '
        'btnCloseAll
        '
        Me.btnCloseAll.Location = New System.Drawing.Point(160, 216)
        Me.btnCloseAll.Name = "btnCloseAll"
        Me.btnCloseAll.Size = New System.Drawing.Size(112, 32)
        Me.btnCloseAll.TabIndex = 3
        Me.btnCloseAll.Text = "Close All Processes"
        '
        'btnLaunch1
        '
        Me.btnLaunch1.Location = New System.Drawing.Point(32, 176)
        Me.btnLaunch1.Name = "btnLaunch1"
        Me.btnLaunch1.Size = New System.Drawing.Size(112, 72)
        Me.btnLaunch1.TabIndex = 1
        Me.btnLaunch1.Text = "Start Notepad"
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(292, 266)
        Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.ListView1, Me.btnClose1, Me.btnCloseAll, Me.btnLaunch1})
        Me.Name = "Form1"
        Me.Text = "Process Example"
        Me.ResumeLayout(False)
    
      End Sub
    
    #End Region
    
      Private procName As String = "notepad"
      Private proc As Process
      Private processes() As Process
      Private specialFolder As String = System.Environment.GetFolderPath(Environment.SpecialFolder.System)
    
      Private Sub buildList()
        'this sub populates the listview control with the instances of 'procName'
        'that are currently running.
        Dim itemAdd As ListViewItem
        ListView1.Items.Clear()
    
        processes = Process.GetProcessesByName(procName)
    
        For Each proc In processes
          itemAdd = ListView1.Items.Add(proc.MainWindowTitle)
          itemAdd.SubItems.Add(proc.Id.ToString)
        Next
    
      End Sub
    
    
      Private Sub btnLaunch1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnLaunch1.Click
        'Launch notepad and open the end user license agreement.
        Dim pInfo As New ProcessStartInfo()
        pInfo.FileName = specialFolder & "\eula.txt"
        pInfo.WindowStyle = ProcessWindowStyle.Minimized
        Dim p As Process = Process.Start(pInfo)
        p.WaitForInputIdle()
        buildList()
      End Sub
    
    
      Private Sub btnClose1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose1.Click
        'Close one of the instances of notepad based on the selected item in the ListView.
        'There are several ways to identify a process. For example,
        'you can use the mainwindowtitle, windowhandle, or processname, depending  
        'on your needs. The process ID is used here because there may be several
        'windows open with the same title.
        Try
          Dim procID As Integer = System.Convert.ToInt32(ListView1.SelectedItems(0).SubItems(1).Text)
          Dim tempProc As Process = Process.GetProcessById(procID)
          tempProc.CloseMainWindow()
          tempProc.WaitForExit()
          buildList()
        Catch
          MessageBox.Show("Please select a process in the ListView before clicking this button." + _
          " Or the Process may have been closed by somebody.")
          buildList()
        End Try
      End Sub
    
      Private Sub btnCloseAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCloseAll.Click
        'Walk the process array and close all processes.
        Try
          For Each proc In processes
            proc.CloseMainWindow()
            proc.WaitForExit()
          Next
          buildList()
        Catch ex As System.NullReferenceException
          MessageBox.Show("No instances of Notepad running.")      
        End Try
      End Sub
    
      Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        'Make sure that you do not leave any instances running.
        If Not (processes Is Nothing) Then
          If (processes.Length <> 0) Then
            Me.btnCloseAll_Click(Me, e)
          End If
        End If
      End Sub
    
    End Class
    					
    : Visual Basic 2005 では、コードを変更する必要があります。Windows フォーム プロジェクトを作成すると、デフォルトでプロジェクト用のファイルが 2 つ作成されます。フォームの名前が Form1 の場合、フォームを表すこの 2 つのファイルの名前は Form1.vb および Form1.Designer.vb です。ユーザーによるコードの記述は Form1.vb ファイルで行います。Form1.Designer.vb ファイルには、Windows フォーム デザイナによってコードが記述されます。Windows フォーム デザイナは、Partial キーワードを使用して、Form1 を 2 つの異なるファイルに分けて実装します。この動作により、Windows フォーム デザイナが生成したコードが、ユーザーが記述したコード内に散在することがなくなります。

    Visual Basic 2005 の新しい言語機能強化の詳細については、以下の MSDN (Microsoft Developer Network) Web サイトを参照してください。
    http://msdn2.microsoft.com/en-us/library/ms379584(vs.80).aspx
    部分クラスおよび Windows フォーム デザイナの詳細については、次のマイクロソフト Web サイトを参照してください。
    http://msdn2.microsoft.com/ja-jp/library/ms171843.aspx
    : [Windows Form Designer generated code] というラベル付きの領域を縮小しておくことをお勧めします。
  4. アプリケーションを実行します。
  5. [Start Notepad] を 1 回以上クリックします。
  6. ListView コントロール ウィンドウでメモ帳のインスタンスをクリックし、[Close Selected Process] をクリックします。これにより、選択したメモ帳の特定のインスタンスが閉じます。また、[Close All Processes] をクリックして、実行中のメモ帳のインスタンスすべてを閉じることもできます。

注意事項

このサンプルでは、Process クラスの Id プロパティを使用して、アプリケーションのインスタンスを区別しています。すべてのプロセス ID は一意であるため、Id プロパティがこの作業に適しています。また、WindowHandle プロパティにも同じことが当てはまります。このため、Process オブジェクトの WindowHandle プロパティを使用して、アプリケーションのインスタンスを区別することもできます。

この作業にはあまり適していませんが、別のプロパティも使用できます。たとえば、特定のプロセスのプロセス ID がわからない場合や、メイン ウィンドウのハンドルを持っていない場合、適切なインスタンスの識別に、MainWindowTitle プロパティを使用することができます。MainWindowTitle プロパティは一意ではない場合がありますが、目的のアプリケーションの区別に役立つ場合があります。

この資料のサンプルでは、Windows アプリケーションを使用しており、CloseMainWindow メソッドによってアプリケーションを閉じます。CloseMainWindow は、Windows アプリケーション以外では動作しません。閉じようとしているアプリケーションがウィンドウを持たない場合 (コンソール アプリケーションなど)、Kill メソッドを使用して、アプリケーションを終了する必要があります。

関連情報

詳細については、次の MSDN (Microsoft Developer Network) Web サイトを参照してください。
Process クラス
http://msdn2.microsoft.com/ja-jp/library/system.diagnostics.process.aspx

プロパティ

文書番号: 305602 - 最終更新日: 2007年5月11日 - リビジョン: 2.2
この資料は以下の製品について記述したものです。
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
キーワード:?
kbvs2005swept kbvs2005applies kbhowtomaster KB305602
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com