CÓMO: Utilizar Visual Basic .NET para cerrar otra aplicación

Seleccione idioma Seleccione idioma
Id. de artículo: 305602 - Ver los productos a los que se aplica este artículo
Este artículo se publicó anteriormente con el número E305602
Expandir todo | Contraer todo

En esta página

Resumen

Este artículo describe cómo cerrar una aplicación desde el interior de ésta. También describe cómo cerrar una instancia específica de otra aplicación, como Bloc de notas, si se está ejecutando más de una instancia de la aplicación.

Análisis de la lógica de programación

Declarar las variables

Hay que definir varias variables. Como estas variables se utilizan en múltiples métodos, deberían ser definidas fuera de cualquier procedimiento. La variable proc mantiene una referencia a un objeto de proceso individual y processes es una matriz que contiene los objetos de proceso que son devueltos por el método GetProcessByName:
Private proc As Process
Private processes() As Process
Private procName As String = "bloc de notas"

Obtener una lista de instancias de la aplicación

El código siguiente incluye una función (denominada buildList en el ejemplo) a la que se llama cada vez que se crea una nueva instancia de Bloc de notas. Este ejemplo almacena la información del proceso en un control ListView; el código para llenar el control ListView se incluye sólo por coherencia con el ejemplo completo. La parte más importante de este código es la llamada al método GetProcessByName de la clase Process. Este método devuelve una serie de objetos Process, que pueden repetirse usando un bloque For... Each como sigue:
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

Cerrar una instancia específica de una aplicación

Cuando se están ejecutando instancias múltiples de una aplicación y quiere cerrar una de ellas, debe diferenciar entre estos procesos. El ejemplo siguiente usa la propiedad Id del objeto Process para indicar a los procesos que se aparten. La propiedad Id y la propiedad MainWindowTitle (otra propiedad del objeto Process) se almacenan en el control ListView. Este código obtiene el elemento que está seleccionado actualmente en el control ListView, obtiene una referencia al proceso usando el método GetProcessById de la clase Process y cierra ese proceso llamando al método CloseMainWindow, del modo siguiente:
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("Seleccione un proceso en ListView antes de hacer clic en este botón." + _
      " O el Proceso puede haber sido cerrado por otro.")
    buildList()
End Try

Cerrar todas las instancias de una aplicación

El cierre de todas las instancias de una determinada aplicación es un procedimiento relativamente sencillo. Puede recorrer la matriz que es devuelta por el método GetProcessByName y llamar al método CloseMainWindow en cada objeto de proceso, de la manera siguiente:
Try
  For Each proc In processes
    proc.CloseMainWindow()
    proc.WaitForExit()
  Next
  buildList()
Catch ex As System.NullReferenceException
  MessageBox.Show("No hay instancias de Bloc de notas en ejecución.")
End Try

Pasos para crear el ejemplo

  1. Iniciar una nueva aplicación de Visual Basic para Windows en Visual Studio .NET.
  2. Haga clic con el botón secundario del mouse (ratón) en el formulario predeterminado, Form1.vb, y seleccione Ver código.
  3. Reemplace el código de la ventana de código por el siguiente:
    Option Strict On
    Option Explicit On 
    
    Public Class Form1
      Inherits System.Windows.Forms.Form
    
    #Region " Código generado por el diseñador de Windows Forms"
    
      Public Sub New()
        MyBase.New()
    
        'Esta llamada es requerida por el Diseñador de formularios de Windows.
        InitializeComponent()
    
        'Agregue cualquier inicialización después de la llamada InitializeComponent().
    
      End Sub
    
      'Form reemplaza a Dispose para limpiar la lista de componentes.
      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
    
      'Requerido por el diseñador de Windows Form.
      Private components As System.ComponentModel.Container
    
      'NOTA: el diseñador de Windows Form requiere el procedimiento siguiente
      'Se puede modificar utilizando el diseñador de Windows Form. 
      'No lo modifique con el editor de código.
      <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 = "Cerrar proceso seleccionado"
        '
        '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 = "Título de ventana"
        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 = "Cerrar todos los procesos"
        '
        '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 = "Iniciar Bloc de notas"
        '
        '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 = "Ejemplo de proceso"
        Me.ResumeLayout(False)
    
      End Sub
    
    #End Region
    
      Private procName As String = "bloc de notas"
      Private proc As Process
      Private processes() As Process
      Private specialFolder As String = System.Environment.GetFolderPath(Environment.SpecialFolder.System)
    
      Private Sub buildList()
        'este procedimiento llena el control listview con las instancias de 'procName'
        'que se están ejecutando actualmente.
        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
        'Inicia el bloc de notas y abre el contrato de licencia de usuario final.
        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
        'Cierra una de las instancias del bloc de notas basada en el elemento seleccionado en ListView.
        'Hay varias maneras de identificar un proceso. Por ejemplo,
        'puede usar mainwindowtitle, windowhandle o processname, dependiendo
        'de sus necesidades. El Id. del proceso se usa aquí porque puede haber varias
        'ventanas del mismo título abiertas.
        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("Seleccione un proceso en ListView antes de hacer clic en este botón." + _
          " O el Proceso puede haber sido cerrado por otro.")
          buildList()
        End Try
      End Sub
    
      Private Sub btnCloseAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCloseAll.Click
        'Recorre la matriz del proceso y cierra todos los procesos.
        Try
          For Each proc In processes
            proc.CloseMainWindow()
            proc.WaitForExit()
          Next
          buildList()
        Catch ex As System.NullReferenceException
          MessageBox.Show("No hay instancias de Bloc de notas en ejecución.")
        End Try
      End Sub
    
      Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        'Comprueba que no deja ninguna instancia en ejecución.
        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: Se recomienda que contraiga la región etiquetada como Código generado por el diseñador de Windows Forms.
  4. : Se recomienda que contraiga la región etiquetada como Ejecute la aplicación.
  5. : Se recomienda que contraiga la región etiquetada como Haga clic en Iniciar Bloc de notas una o varias veces.
  6. : Se recomienda que contraiga la región etiquetada como Haga clic en una instancia de Bloc de notas en la ventana del control ListView y seleccione Cerrar proceso. Esto cierra la instancia específica del Bloc de notas que seleccionó. También puede seleccionar Cerrar todos los procesos para cerrar todas las instancias de Bloc de notas en ejecución.

Notas

Este ejemplo usa la propiedad Id de la clase Process para diferenciar entre instancias de la aplicación. La propiedad Id es un buen candidato para esta tarea porque todos los Id. del proceso son exclusivos. Lo mismo se puede decir de la propiedad WindowHandle, por lo que también puede usar la propiedad WindowHandle de un objeto Process para diferenciar entre instancias de la aplicación.

Se pueden usar también otras propiedades, aunque son menos adecuadas para la tarea. Por ejemplo, si no conoce el Id. del proceso de un proceso específico o tiene el controlador de la ventana principal, puede usar la propiedad MainWindowTitle para ayudar a identificar la instancia apropiada. La propiedad MainWindowTitle puede no ser única, pero puede ayudarle a aislar la aplicación deseada.

El ejemplo de este artículo usa una aplicación de Windows y emplea el método CloseMainWindow para cerrar la aplicación. CloseMainWindow no funciona con una aplicación que no sea de Windows. Si la aplicación que intenta cerrar no tiene una ventana (por ejemplo una aplicación de consola), debe usar el método Kill para cerrar la aplicación.

REFERENCIAS

Para obtener más información, consulte el sitio Web de Microsoft Developer Network (MSDN) siguiente:
Process Class
http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDiagnosticsProcessClassTopic.asp

Propiedades

Id. de artículo: 305602 - Última revisión: jueves, 10 de abril de 2003 - Versión: 1.0
La información de este artículo se refiere a:
  • Microsoft Visual Basic .NET 2002 Standard Edition
Palabras clave: 
kbhowto kbhowtomaster KB305602

Enviar comentarios

 

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