Cómo utilizar Visual C# para cerrar otra aplicación

Para una versión de Microsoft Visual Basic .NET de este artículo, consulte
305602 .

Para una versión de Microsoft Visual C++ .NET de este artículo, consulte
307395 .

Este artículo hace referencia al siguiente espacio de nombres de biblioteca de clases de Microsoft.NET Framework:
  • System.Diagnostics

EN ESTA TAREA


Resumen

En este artículo paso a paso se muestra cómo cerrar una aplicación desde dentro de una aplicación. También describe cómo cerrar una instancia específica de otra aplicación, como el Bloc de notas, si se está ejecutando más de una instancia de la aplicación.

Explicación de la lógica de programación

Declarar Variables

Se deben definir varias variables. Debido a estas variables se utilizan en varios métodos, deben definirse fuera de cualquier procedimiento de forma que permanezcan en el ámbito. La primera variable es una matriz que contiene los objetos de proceso que son devueltos por el método GetProcessByName y la variable de cadena que se utiliza para contener que el nombre del proceso es procName:
private Process[] processes;private string procName = "Notepad";

Obtener una lista de instancias de la aplicación

El código siguiente incluye una función (denominada buildList en el ejemplo) 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 matriz de objetos Process , que pueda recorrerse en iteración para... Cada bloque:
ListViewItem itemAdd ; ListView1.Items.Clear();
processes = Process.GetProcessesByName(procName);
foreach (Process proc in processes)
{
itemAdd = ListView1.Items.Add(proc.MainWindowTitle);
itemAdd.SubItems.Add(proc.Id.ToString());
}

Cerrar una instancia específica de una aplicación

Cuando se ejecutan varias instancias de una aplicación y desea cerrar una instancia, debe diferenciar entre estos procesos. En el siguiente ejemplo utiliza 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 . El 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 :
try{         
int procID=System.Convert.ToInt32(ListView1.SelectedItems[0].SubItems[1].Text);
Process tempProc=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();
}

Cierre todas las instancias de una aplicación

Cierre todas las instancias de una determinada aplicación es relativamente sencilla. Puede recorrer la matriz devuelta por el método GetProcessByName y llame al método CloseMainWindow en cada objeto de proceso, como sigue:
try{
foreach (Process proc in processes)
{
proc.CloseMainWindow();
proc.WaitForExit();
}
buildList();
}
catch (System.NullReferenceException)
{
MessageBox.Show("No instances of Notepad running.");
}

Pasos para generar el ejemplo

  1. Inicie una nueva aplicación para Windows de Visual C# en Visual Studio .NET.
  2. Haga clic en el formulario predeterminado, Form1.cs y seleccione Ver código.
  3. Reemplace el código que está en la ventana de código con lo siguiente:
    using System;using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using System.Diagnostics;

    namespace closeApplication_cs
    {
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
    internal System.Windows.Forms.Button btnCloseAll;
    internal System.Windows.Forms.ColumnHeader ColumnHeader2;
    internal System.Windows.Forms.ColumnHeader ColumnHeader1;
    internal System.Windows.Forms.Button btnLaunch1;
    internal System.Windows.Forms.ListView ListView1;
    internal System.Windows.Forms.Button btnClose1;
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.Container components = null;

    private Process[] processes;
    private string procName = "Notepad";
    private string specialFolder = System.Environment.GetFolderPath(Environment.SpecialFolder.System);

    public Form1()
    {
    //
    // Required for Windows Form Designer support.
    //
    InitializeComponent();
    //
    // To do: Add any constructor code after the InitializeComponent call.
    //
    }

    /// <summary>
    /// Clean up any resources that are being used.
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if (components != null)
    {
    components.Dispose();
    }
    }
    base.Dispose( disposing );
    }

    #region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
    this.btnClose1 = new System.Windows.Forms.Button();
    this.ColumnHeader2 = new System.Windows.Forms.ColumnHeader();
    this.ColumnHeader1 = new System.Windows.Forms.ColumnHeader();
    this.btnCloseAll = new System.Windows.Forms.Button();
    this.btnLaunch1 = new System.Windows.Forms.Button();
    this.ListView1 = new System.Windows.Forms.ListView();
    this.SuspendLayout();
    //
    // btnClose1
    //
    this.btnClose1.Location = new System.Drawing.Point(160, 176);
    this.btnClose1.Name = "btnClose1";
    this.btnClose1.Size = new System.Drawing.Size(112, 32);
    this.btnClose1.TabIndex = 4;
    this.btnClose1.Text = "Close Selected Process";
    this.btnClose1.Click += new System.EventHandler(this.btnClose1_Click);
    //
    // ColumnHeader2
    //
    this.ColumnHeader2.Text = "Process ID";
    this.ColumnHeader2.Width = 85;
    //
    // ColumnHeader1
    //
    this.ColumnHeader1.Text = "Window Title";
    this.ColumnHeader1.Width = 160;
    //
    // btnCloseAll
    //
    this.btnCloseAll.Location = new System.Drawing.Point(160, 216);
    this.btnCloseAll.Name = "btnCloseAll";
    this.btnCloseAll.Size = new System.Drawing.Size(112, 32);
    this.btnCloseAll.TabIndex = 3;
    this.btnCloseAll.Text = "Close All Processes";
    this.btnCloseAll.Click += new System.EventHandler(this.btnCloseAll_Click);
    //
    // btnLaunch1
    //
    this.btnLaunch1.Location = new System.Drawing.Point(32, 176);
    this.btnLaunch1.Name = "btnLaunch1";
    this.btnLaunch1.Size = new System.Drawing.Size(112, 72);
    this.btnLaunch1.TabIndex = 1;
    this.btnLaunch1.Text = "Start Notepad";
    this.btnLaunch1.Click += new System.EventHandler(this.btnLaunch1_Click);
    //
    // ListView1
    //
    this.ListView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
    this.ColumnHeader1,
    this.ColumnHeader2});
    this.ListView1.Location = new System.Drawing.Point(22, 8);
    this.ListView1.MultiSelect = false;
    this.ListView1.Name = "ListView1";
    this.ListView1.Size = new System.Drawing.Size(250, 152);
    this.ListView1.TabIndex = 7;
    this.ListView1.View = System.Windows.Forms.View.Details;
    //
    // Form1
    //
    this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
    this.ClientSize = new System.Drawing.Size(292, 266);
    this.Controls.AddRange(new System.Windows.Forms.Control[] {
    this.btnCloseAll,
    this.btnLaunch1,
    this.ListView1,
    this.btnClose1});
    this.Name = "Form1";
    this.Text = "Process Example";
    this.Closing += new System.ComponentModel.CancelEventHandler(this.closing);
    this.Load += new System.EventHandler(this.Form1_Load);
    this.ResumeLayout(false);

    }
    #endregion

    [STAThread]
    static void Main()
    {
    Application.Run(new Form1());
    }

    private void buildList()
    {
    ListViewItem itemAdd ;
    ListView1.Items.Clear();
    processes = Process.GetProcessesByName(procName);
    foreach (Process proc in processes)
    {
    itemAdd = ListView1.Items.Add(proc.MainWindowTitle);
    itemAdd.SubItems.Add(proc.Id.ToString());
    }
    }

    private void btnLaunch1_Click(object sender, System.EventArgs e)
    {
    ProcessStartInfo p = new ProcessStartInfo();
    p.FileName = specialFolder + @"\eula.txt";
    p.WindowStyle = ProcessWindowStyle.Minimized ;
    Process proc =Process.Start(p);
    proc.WaitForInputIdle();
    buildList();
    }
    private void Form1_Load(object sender, System.EventArgs e)
    {

    }

    private void btnClose1_Click(object sender, System.EventArgs e)
    {
    try
    {
    int procID=System.Convert.ToInt32(ListView1.SelectedItems[0].SubItems[1].Text);
    Process tempProc=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();
    }
    }

    private void btnCloseAll_Click(object sender, System.EventArgs e)
    {
    try
    {
    foreach (Process proc in processes)
    {
    proc.CloseMainWindow();
    proc.WaitForExit();
    }
    buildList();
    }
    catch (System.NullReferenceException)
    {
    MessageBox.Show("No instances of Notepad running.");
    }
    }

    private void closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
    //Make sure that you do not leave any instances running.
    if (processes != null && processes.Length!=0)
    this.btnCloseAll_Click(this,e);
    }
    }
    }

    Nota: El código se debe cambiar en Visual Studio 2005. Para obtener más información, visite el siguiente sitio Web de MSDN:De forma predeterminada, cuando crea un proyecto de formularios Windows Forms, Visual C# agrega un formulario al proyecto denominado Form1. Los dos archivos que lo representan se denominan Form1.cs y Form1.designer.cs. Escriba el código en Form1.cs. El archivo Form1.designer.cs es donde el Diseñador de Windows Forms escribe el código que implementa todas las acciones que lleve a cabo arrastrando los controles del cuadro de herramientas.

    Nota: Se recomienda que contraiga la zona denominada
    Código generado por el Diseñador de Windows Forms.
  4. Ejecute la aplicación.
  5. Haga clic en Iniciar Bloc de notas una o más veces.
  6. 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 en ejecución del Bloc de notas.

Notas:

Este ejemplo utiliza 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 son únicos. Lo mismo es true de la propiedad WindowHandle , por lo que también puede utilizar la propiedad WindowHandle de un objeto Process para diferenciar entre instancias de la aplicación.


Otras propiedades también pueden utilizarse, aunque son menos adecuadas para la tarea. Por ejemplo, si no conoce el identificador de proceso de un proceso específico o tiene el identificador de la ventana principal, puede utilizar la propiedad MainWindowTitle para ayudar a identificar la instancia adecuada. 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 Windows y emplea el método CloseMainWindow para cerrar la aplicación. CloseMainWindow no funciona con una aplicación que no sea Windows. Si la aplicación que intenta cerrar no tiene una ventana (por ejemplo, una aplicación de consola), debe utilizar el método Kill para cerrar la aplicación.



REFERENCIAS

Para obtener más información, consulte el siguiente sitio Web de Microsoft Developer Network (MSDN):
Propiedades

Id. de artículo: 305603 - Última revisión: 22 ene. 2017 - Revisión: 2

Comentarios