SO WIRD'S GEMACHT: Verwenden von Visual Basic .NET zum Schließen einer anderen Anwendung

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 305602 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Dieser Artikel wurde zuvor veröffentlicht unter D305602
Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
305602 HOW TO: Use Visual Basic .NET to Close Another Application
Alles erweitern | Alles schließen

Auf dieser Seite

Zusammenfassung

Dieser Artikel beschreibt, wie Sie eine Anwendung von einer Anwendung aus schließen können. Außerdem wird beschrieben, wie Sie eine bestimmte Instanz einer anderen Anwendung, wie beispielsweise Notepad, schließen können, wenn mehrere Instanzen der Anwendung ausgeführt werden.

Zurück zum Anfang

Erläuterung der Programmlogik

Deklarieren von Variablen

Es müssen verschiedene Variablen definiert werden. Da diese Variablen in mehreren Methoden Verwendung finden, sollten Sie außerhalb der Prozeduren definiert werden, damit sie im Gültigkeitsbereich bleiben. Die Variable proc enthält einen Verweis auf ein einzelnes Prozessobjekt, und processes ist ein Array, das die Prozessobjekte enthält, die von der Methode GetProcessByName zurückgegeben werden:
Private proc As Process
Private processes() As Process
Private procName As String = "notepad"

Abrufen einer Liste der Anwendungsinstanzen

Der folgende Code beinhaltet eine Funktion (im Beispiel wird sie buildList genannt), die immer dann aufgerufen wird, wenn eine neue Instanz von Notepad erstellt wird. Dieser Beispielcode speichert die Prozessinformationen in einem ListView-Steuerelement. Der Code, der das ListView-Steuerelement mit Daten füllt, wurde nur eingefügt, damit die Konsistenz des gesamten Beispielcodes gewährleistet ist. Der wichtigste Teil dieses Codes ist der Aufruf der Methode GetProcessByName der Klasse Process. Diese Methode gibt ein Array von Process-Objekten zurück, das mithilfe eines For ... Each-Blocks wie folgt iteriert werden kann:
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

Schließen einer bestimmten Anwendungsinstanz

Wenn mehrere Instanzen einer Anwendung ausgeführt werden und eine Instanz dieser Anwendung geschlossen werden soll, müssen Sie die einzelnen Prozesse unterscheiden können. Der folgende Beispielcode verwendet die Id-Eigenschaft des Objekts Process zum Unterscheiden der Prozesse. Die Eigenschaften Id und MainWindowTitle (eine weitere Eigenschaft des Objekts Process) werden im ListView-Steuerelement gespeichert. Der Code ruft das Element ab, das gegenwärtig im ListView-Steuerelement ausgewählt ist. Er ruft mithilfe der Methode GetProcessById der Klasse Process einen Verweis auf den Prozess ab und schließt diesen Prozess wie folgt durch Aufrufen der Methode 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

Schließen aller Instanzen einer Anwendung

Das Schließen aller Instanzen einer bestimmten Anwendung ist ein relativ einfaches Verfahren. Sie können das Array durchlaufen, das von der Methode GetProcessByName zurückgegeben wird und anschließend die Methode CloseMainWindow für jedes Prozessobjekt aufrufen. Gehen Sie dazu wie folgt vor:
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
Zurück zum Anfang

Anleitung zum Erstellen des Beispiels

  1. Starten Sie eine neue Visual Basic-Windows-Anwendung in Visual Studio .NET.
  2. Klicken Sie mit der rechten Maustaste auf das Standardformular Form1.vb, und wählen Sie die Option Code anzeigen.
  3. Ersetzen Sie den Code im Code-Fenster durch Folgendes:
    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
    HINWEIS: Es empfiehlt sich, die Region Windows Form Designer generated code zu komprimieren.
  4. Führen Sie die Anwendung aus.
  5. Klicken Sie ein- oder mehrmals auf Start Notepad.
  6. Klicken Sie im Fenster des ListView-Steuerelements auf eine Instanz von Notepad und wählen Sie die Option Prozess schließen. Hierdurch wird die von Ihnen gewählte Instanz von Notepad geschlossen. Sie können auch die Option Alle Prozesse schließen wählen, um sämtliche derzeit ausgeführten Instanzen von Notepad zu schließen.

Anmerkungen

Dieser Beispielcode verwendet die Id-Eigenschaft des Process-Objekts zum Unterscheiden der Anwendungsinstanzen. Die Id-Eigenschaft ist gut für diese Aufgabe geeignet, da alle Prozesskennungen eindeutig sind. Das gleiche gilt für die WindowHandle-Eigenschaft. Deshalb können Sie die WindowHandle-Eigenschaft eines Process-Objekts zum Unterscheiden der Instanzen der Anwendung verwenden.

Es können zwar auch andere Eigenschaften verwendet werden, jedoch sind sie für diese Aufgabe weniger gut geeignet. Wenn Sie beispielsweise die Prozesskennung eines bestimmten Prozesses oder die Zugriffsnummer des Hauptfensters nicht kennen, können Sie mithilfe der Eigenschaft MainWindowTitle die richtige Instanz ermitteln. Die Eigenschaft MainWindowTitle ist zwar nicht eindeutig, jedoch kann Sie Ihnen dabei helfen, die gewünschte Anwendung zu finden.

Der Beispielcode in diesem Artikel verwendet eine Windows-Anwendung und nutzt die Methode CloseMainWindow zum Schließen der Anwendung. CloseMainWindow kann jedoch nur bei Windows-Anwendungen verwendet werden. Wenn die Anwendung, die Sie schließen möchten, nicht über ein Fenster verfügt (z.B. eine Konsolenanwendung), müssen Sie die Methode Kill zum Schließen der Anwendung verwenden.

Zurück zum Anfang

Informationsquellen

Weitere Informationen finden Sie auf der folgenden Webseite des Microsoft Developer Network (MSDN):
Die Klasse "Process"
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDiagnosticsProcessClassTopic.asp
Zurück zum Anfang

Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.

Eigenschaften

Artikel-ID: 305602 - Geändert am: Donnerstag, 3. April 2003 - Version: 1.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual Basic .NET 2002 Standard Edition
Keywords: 
kbhowto kbhowtomaster KB305602
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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