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

Traduzione articoli Traduzione articoli
Identificativo articolo: 305602 - Visualizza i prodotti a cui si riferisce l?articolo.
Questo articolo Ŕ stato precedentemente pubblicato con il codice di riferimento I305602
Espandi tutto | Chiudi tutto

In questa pagina

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):
Process Class
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDiagnosticsProcessClassTopic.asp

ProprietÓ

Identificativo articolo: 305602 - Ultima modifica: martedý 8 aprile 2003 - Revisione: 1.0
Le informazioni in questo articolo si applicano a
  • Microsoft Visual Basic .NET 2002 Standard Edition
Chiavi:á
kbhowto kbhowtomaster KB305602
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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