HOW TO: Utilizzare Visual Basic .NET per chiudere un'altra applicazione

Per la versione di questo articolo relativa a Microsoft Visual C# .NET vedere (gli articoli con prefisso "Q" contengono informazioni in inglese): 305603 .



Contenuto dell'attività


Sommario

In questo articolo viene descritto come chiudere un'applicazione dall'interno di un'altra applicazione. Viene altresì spiegato come chiudere una specifica istanza di un'altra applicazione, ad esempio Blocco note, qualora siano in esecuzione più istanze di tale applicazione.


Informazioni sulla logica di programmazione

Dichiarazione di variabili

È necessario definire numerose variabili. Poiché queste variabili sono utilizzate in metodi diversi, sarà necessario definirle al di fuori di qualsiasi procedura affinché rimangano nell'ambito di validità. La variabile
proc
contiene un riferimento a un singolo oggetto processo, mentre
processes
è una matrice che contiene gli oggetti processo restituiti dal metodo
GetProcessByName:
Private proc As Process
Private processes() As Process
Private procName As String = "notepad"

Ottenere un elenco di istanze di applicazione

Il codice che segue comprende una funzione, denominata
buildList
nell'esempio, che viene chiamata ogni volta che viene creata una nuova istanza di Blocco note. Nel codice di esempio riportato in questo articolo le informazioni sul processo vengono memorizzate in un controllo
ListView. Il codice con cui popolare il controllo
ListView
è incluso solo per coerenza con il codice di esempio completo. La parte più importante di questo codice è la chiamata al metodo
GetProcessByName
della classe
Process. Questo metodo restituisce una matrice di oggetti
Process
che possono essere iterati utilizzando un blocco
For...Each, come illustrato di seguito:
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

Chiudere una specifica istanza di un'applicazione

Se si desidera chiudere una delle varie istanze in esecuzione di una stessa applicazione, è necessario differenziare tali processi. Nel codice di esempio riportato di seguito viene utilizzata la proprietà
Id
dell'oggetto
Process
per differenziare i processi. La proprietà
Id
e la proprietà
MainWindowTitle
(un'altra proprietà dell'oggetto
Process
) vengono memorizzate nel controllo
ListView. Il codice ottiene l'elemento correntemente selezionato nel controllo
ListView, ottiene un riferimento al processo utilizzando il metodo
GetProcessById
della classe
Process
e chiude tale processo chiamando il metodo
CloseMainWindow, come illustrato di seguito:
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

Chiudere tutte le istanze di un'applicazione

Chiudere tutte le istanze di una particolare applicazione è un'operazione relativamente veloce. È possibile esaminare la matrice che viene restituita dal metodo
GetProcessByName
e chiamare il metodo
CloseMainWindow
in ciascun oggetto processo, come illustrato di seguito:
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

Procedura per compilare il progetto di esempio

  1. Avviare una nuova applicazione Windows Visual Basic in Visual Basic .NET.
  2. Fare clic con il pulsante destro del mouse sul modulo predefinito, Form1.vb, e scegliere
    Visualizza codice.
  3. Sostituire il codice presente nella finestra del codice con quello riportato di seguito:
    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
    NOTA: si raccomanda di comprimere la sezione
    Windows Form Designer generated code.
  4. : si raccomanda di comprimere la sezione Eseguire l'applicazione.
  5. : si raccomanda di comprimere la sezione Fare clic su
    Avvia Blocco note
    una o più volte.
  6. : si raccomanda di comprimere la sezione Fare clic su un'istanza di Blocco note nella finestra del controllo
    ListView
    e selezionare
    Chiudi processo. L'istanza selezionata di Blocco note verrà chiusa. È anche possibile selezionare
    Chiudi tutti i processi
    per chiudere tutte le istanze in esecuzione di Blocco note.

Note

Il codice di esempio qui riportato utilizza la proprietà
Id
della classe
Process
per differenziare le varie istanze dell'applicazione. La proprietà
Id
è un'ottima candidata per questa operazione in quanto tutti gli ID di processo sono univoci. Lo stesso vale per la proprietà
WindowHandle, pertanto è altresì possibile utilizzare la proprietà
WindowHandle
di un oggetto
Process
per differenziare le istanze dell'applicazione.


È possibile utilizzare altre proprietà, sebbene meno adatte per questa operazione. Ad esempio, se non si conosce l'ID di processo di un determinato processo o si dispone dell'handle della finestra principale, sarà possibile utilizzare la proprietà
MainWindowTitle
per identificare l'istanza corretta. La proprietà
MainWindowTitle
potrebbe non essere univoca, ma può aiutare a isolare l'applicazione desiderata.


Il codice di esempio riportato in questo articolo utilizza un'applicazione Windows e impiega il metodo
CloseMainWindow
per chiudere l'applicazione.
CloseMainWindow
non funziona con applicazioni non Windows. Se l'applicazione che si tenta di chiudere non ha finestre, ad esempio si tratta di un'applicazione console, sarà necessario utilizzare il metodo
Kill
per chiuderla.


RIFERIMENTI

Per ulteriori informazioni, visitare il seguente sito Web MSDN (informazioni in lingua inglese):
Proprietà

ID articolo: 305602 - Ultima revisione: 07 apr 2003 - Revisione: 1

Feedback