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

Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
305602 HOW TO: Use Visual Basic .NET to Close Another Application
In Artikel 305603 wird dieses Problem für Microsoft Visual C# .NET beschrieben.



Hinweis: Die Verwendung der hier aufgeführten Informationen sowie Makro- oder Programmcodes geschieht auf Ihre eigene Verantwortung. Microsoft stellt Ihnen diese Informationen sowie Makro- und Programmlistings ohne Gewähr auf Richtigkeit, Vollständigkeit und/oder Funktionalität sowie ohne Anspruch auf Support zur Verfügung. Die zur Verfügung gestellten Makro- und Programmierungsbeispiele sollen lediglich exemplarisch die Funktionsweise des Beispiels aufzeigen.


Weitere Informationen zu den von Microsoft angebotenen Supportoptionen finden Sie unter folgender Internetadresse:

Inhalt


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.


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

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.


Informationsquellen

Weitere Informationen finden Sie auf der folgenden Webseite des Microsoft Developer Network (MSDN):


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

Artikelnummer: 305602 – Letzte Überarbeitung: 02.04.2003 – Revision: 1

Feedback