Comment utiliser Visual Basic .NET ou Visual Basic 2005 pour fermer une autre application

Traductions disponibles Traductions disponibles
Numéro d'article: 305602 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article décrit comment fermer une application à partir d'une application. Il décrit également comment fermer une instance spécifique d'une autre application, telle que le bloc-notes, si plus d'une instance de l'application s'exécute.

Description de la logique de programmation

Déclarer des variables

Plusieurs variables doivent être définies. Étant donné que ces variables sont utilisées dans plusieurs méthodes, ils doivent être définis en dehors de toute procédure afin qu'ils restent dans la portée. La variable de procédure conserve une référence à un objet de processus individuels et processus est un tableau qui contient les objets de processus renvoyés par la méthode GetProcessByName :
Private proc As Process
Private processes() As Process
Private procName As String = "notepad"
				

Obtenir une liste d'instances d'application

Le code suivant comprend une fonction (appelée buildList dans l'exemple) qui est appelée chaque fois qu'une nouvelle instance du bloc-notes est créée. Cet exemple stocke les informations de processus dans un contrôle ListView ; le code pour remplir le contrôle ListView est inclus uniquement pour la cohérence avec l'exemple complet. La partie la plus importante de ce code est l'appel à la méthode GetProcessByName de la classe Process . Cette méthode retourne un tableau d'objets de processus , qui peut être parcourue sur en utilisant un for ... Each bloquer, comme suit :
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
				

Fermer une instance spécifique d'une application

Lorsque plusieurs instances d'une application sont en cours d'exécution et que vous souhaitez fermer une instance, vous devez distinguer entre ces processus. L'exemple suivant utilise la propriété ID de l'objet processus pour indiquer les processus séparés. La propriété ID et la propriété MainWindowTitle (une autre propriété de l'objet processus ) sont stockés dans le contrôle ListView . Le code obtient l'élément actuellement sélectionné dans le contrôle ListView , obtient une référence au processus en utilisant la méthode GetProcessById de la classe Process et ferme ce processus en appelant la méthode CloseMainWindow , comme suit :
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
				

Fermez toutes les instances d'une application

Fermeture de toutes les instances d'une application particulière est relativement simple. Vous pouvez parcourir le tableau qui est renvoyée par la méthode GetProcessByName et appelez la méthode CloseMainWindow sur chaque objet processus, comme suit :
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
				

Procédures pour créer l'exemple

  1. Démarrez une nouvelle application Windows Visual Basic dans Visual Studio .NET ou dans Visual Studio 2005.
  2. Cliquez avec le bouton droit sur le formulaire par défaut, Form1.vb et sélectionnez Afficher le code .
  3. Remplacez le code est dans la fenêtre code avec les éléments suivants :
    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
    					
    Remarque vous devez modifier le code dans Visual Basic 2005. Par défaut, Visual Basic crée deux fichiers pour le projet lorsque vous créez un Windows Form projet. Si le formulaire est nommé Form1, les deux fichiers représentent le formulaire sont nommés Form1.vb et Form1.Designer.vb. Vous écrivez le code dans le fichier Form1.vb. Le Concepteur Windows Forms écrit le code dans le fichier Form1.Designer.vb. Le Concepteur Windows Forms utilise le mot clé partial pour diviser l'implémentation de Form1 en deux fichiers distincts. Ce comportement empêche le code généré par le Concepteur de parsemés dans votre code.

    Pour plus d'informations sur les nouvelles améliorations du langage Visual Basic 2005, site Web MSDN (Microsoft Developer Network) suivant :
    http://msdn.microsoft.com/en-us/library/ms379584(VS.80).aspx
    Pour plus d'informations sur les classes partielles et Windows Forms Designer, site Web MSDN suivant :
    http://msdn2.microsoft.com/en-us/library/ms171843.aspx
    Remarque Il est recommandé de réduire la zone qui porte le que code généré par le Concepteur Windows Form .
  4. Exécutez l'application.
  5. Cliquez sur Démarrer le bloc-notes une ou plusieurs fois.
  6. Cliquez sur une instance du bloc-notes dans la fenêtre de contrôle de liste et sélectionnez Traiter fermer . Ce bouton ferme l'instance spécifique du bloc-notes que vous avez sélectionné. Vous pouvez également sélectionner Fermer tous les processus pour fermer toutes les instances en cours d'exécution du bloc-notes.

Notes

Cet exemple utilise la propriété ID de la classe Process pour différencier les instances de l'application. La propriété ID est un bon candidat pour cette tâche car tous les processus ID sont uniques. Est vrai pour la propriété WindowHandle , afin de pouvoir également utiliser la propriété WindowHandle d'un objet processus pour différencier les instances de l'application.

Autres propriétés peuvent également être utilisées, bien qu'ils soient moins adaptées à la tâche. Par exemple, si vous ne pas déterminer l'ID de processus d'un processus spécifique ou avec le handle de la fenêtre principale, vous pouvez utiliser la propriété MainWindowTitle pour identifier l'instance appropriée. La propriété MainWindowTitle peut ne pas être unique, mais cela peut vous aider à isoler l'application souhaitée.

L'exemple de cet article utilise un Windows application et utilise la méthode CloseMainWindow pour fermer l'application. CloseMainWindow ne fonctionne pas avec une application non-Windows. Si l'application que vous essayez de fermer ne possède pas de fenêtre (par exemple, une application console), vous devez utiliser la méthode Kill pour fermer l'application.

RÉFÉRENCES

Pour plus d'informations, voir du développeur de Microsoft suivant site Web Network (MSDN) :
Classe de processus
http://msdn.microsoft.com/en-us/library/system.diagnostics.process(VS.71).aspx

Propriétés

Numéro d'article: 305602 - Dernière mise à jour: jeudi 29 mars 2007 - Version: 2.7
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Initiation
  • Microsoft Visual Basic .NET 2002 Initiation
Mots-clés : 
kbmt kbvs2005swept kbvs2005applies kbhowtomaster KB305602 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 305602
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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