Al momento sei offline in attesa che la connessione Internet venga ristabilita

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

Questo articolo è stato precedentemente pubblicato con il codice di riferimento I305602
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.

Torna all'inizio

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 variabileproccontiene un riferimento a un singolo oggetto processo, mentreprocessesè una matrice che contiene gli oggetti processo restituiti dal metodoGetProcessByName:
Private proc As ProcessPrivate processes() As ProcessPrivate procName As String = "notepad"

Ottenere un elenco di istanze di applicazione

Il codice che segue comprende una funzione, denominatabuildListnell'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 controlloListView. Il codice con cui popolare il controlloListViewè incluso solo per coerenza con il codice di esempio completo. La parte più importante di questo codice è la chiamata al metodoGetProcessByNamedella classeProcess. Questo metodo restituisce una matrice di oggettiProcessche possono essere iterati utilizzando un bloccoFor...Each, come illustrato di seguito:
Dim itemAdd As ListViewItemListView1.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àIddell'oggettoProcessper differenziare i processi. La proprietàIde la proprietàMainWindowTitle(un'altra proprietà dell'oggettoProcess) vengono memorizzate nel controlloListView. Il codice ottiene l'elemento correntemente selezionato nel controlloListView, ottiene un riferimento al processo utilizzando il metodoGetProcessByIddella classeProcesse chiude tale processo chiamando il metodoCloseMainWindow, 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 metodoGetProcessByNamee chiamare il metodoCloseMainWindowin 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
Torna all'inizio

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 scegliereVisualizza codice.
  3. Sostituire il codice presente nella finestra del codice con quello riportato di seguito:
    Option Strict OnOption 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 SubEnd Class
    NOTA: si raccomanda di comprimere la sezioneWindows Form Designer generated code.
  4. : si raccomanda di comprimere la sezioneEseguire l'applicazione.
  5. : si raccomanda di comprimere la sezioneFare clic suAvvia Blocco noteuna o più volte.
  6. : si raccomanda di comprimere la sezioneFare clic su un'istanza di Blocco note nella finestra del controlloListViewe selezionareChiudi processo. L'istanza selezionata di Blocco note verrà chiusa. È anche possibile selezionareChiudi tutti i processiper chiudere tutte le istanze in esecuzione di Blocco note.

Note

Il codice di esempio qui riportato utilizza la proprietàIddella classeProcessper 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àWindowHandledi un oggettoProcessper 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àMainWindowTitleper identificare l'istanza corretta. La proprietàMainWindowTitlepotrebbe 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 metodoCloseMainWindowper chiudere l'applicazione.CloseMainWindownon 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 metodoKillper chiuderla.

Torna all'inizio

RIFERIMENTI

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

ID articolo: 305602 - Ultima revisione: 04/08/2003 12:52:00 - Revisione: 1.0

Microsoft Visual Basic .NET 2002 Standard Edition

  • kbhowto kbhowtomaster KB305602
Feedback
var m=document.createElement('meta');m.name='ms.dqp0';m.content='true';document.getElementsByTagName('head')[0].appendChild(m);" onload="var m=document.createElement('meta');m.name='ms.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?">