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
305603 .

EN ESTA TAREA


Resumen

Este artículo describe cómo cerrar otra aplicación desde dentro de la aplicación. Este artículo 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.

Volver al principio

Declarar Variables

Debe definir varias variables. Debido a estas variables se utilizan en varios métodos, definirlos fuera de cualquier procedimiento de forma que permanezcan en el ámbito.

La primera variable es una matriz que contenga los objetos de proceso que devuelve el método GetProcessByName . En este código, "procName" es una variable de cadena que se utiliza para contener el nombre del proceso:
private:   Process *processes[];
static String *procName = S"Notepad";
Volver al principio

Obtener una lista de instancias de la aplicación

El código siguiente para la función BuildList 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 que sigue.

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 punteros de objeto de proceso, que pueden repetirse usando un bucle For .
ListViewItem *itemAdd ; ListView1->Items->Clear();
processes = Process::GetProcessesByName(procName);
for (int i = 0; i < processes->Length; i++)
{
itemAdd = ListView1->Items->Add(processes[i]->MainWindowTitle);
itemAdd->SubItems->Add(processes[i]->Id.ToString());
}
Volver al principio

Cerrar una instancia específica de una aplicación

Cuando haya varias instancias de una aplicación en ejecución, si desea cerrar una de ellas, debe diferenciar entre estos procesos. En este ejemplo se utiliza la propiedad Id para diferenciar entre los procesos. La propiedad Id y la propiedad MainWindowTitle 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, a continuación, cierra ese proceso llamando al método CloseMainWindow . Tenga en cuenta que no se puede reconstruir la lista antes de que el proceso ha terminado completamente porque el método WaitForExit de la clase Process evita que esto.
try{         
ListViewItem *lvi = ListView1->SelectedItems->get_Item(0);
ListViewItem::ListViewSubItem *lvsi = lvi->SubItems->get_Item(1);
int procID = System::Convert::ToInt32(lvsi->Text);
Process *tempProc=Process::GetProcessById(procID);
tempProc->CloseMainWindow();
tempProc->WaitForExit();
BuildList();
}
catch(...)
{
MessageBox::Show(S"Select a process in the ListView.");
}

Volver al principio

Cierre todas las instancias de una aplicación

Para cerrar todas las instancias de una aplicación determinada, recorrer la matriz que devuelve el método GetProcessByName y, a continuación, llame al método CloseMainWindow en cada objeto de proceso.
try{
for (int i = 0; i < processes->Length; i++)
{
processes[i]->CloseMainWindow();
}

ListView1->Items->Clear();
}
catch (System::NullReferenceException *)
{
MessageBox::Show("No instances of Notepad running.");
}

Volver al principio

Ejemplo paso a paso

  1. En Microsoft Visual Studio .NET o Microsoft Visual Studio 2005, cree una nueva aplicación de C++ administrado. Para ello, siga estos pasos:
    1. Inicie Visual Studio .NET o Visual Studio 2005.
    2. En el menú archivo , elija
      De nuevoy, a continuación, haga clic en proyecto.
    3. En el cuadro de diálogo Nuevo proyecto , haga clic en
      Proyectos de visual C++ en Tipos de proyectoy, a continuación, haga clic en Aplicación C++ administrada para Visual Studio .NET 2002, haga clic en Aplicación de consola (. NET) para Visual Studio .NET 2003 o haga clic en Aplicación de consola CLR para Visual Studio 2005 en
      Plantillas.
    4. En el cuadro nombre , escriba un nombre de archivo.
  2. En el Explorador de soluciones, abra el archivo .cpp del proyecto.
  3. Reemplace el código en la ventana de código con lo siguiente:
    #include "stdafx.h"#include <windows.h>
    #ifdef MessageBox
    #undef MessageBox
    #endif

    #using <mscorlib.dll>
    #using "System.Dll"
    #using "System.Windows.Forms.Dll"
    #using "System.Drawing.Dll"

    using namespace System;
    using namespace System::Drawing;
    using namespace System::Collections;
    using namespace System::ComponentModel;
    using namespace System::Windows::Forms;
    using namespace System::Diagnostics;

    namespace CloseApplication_mc
    {
    public __gc class Form1 : public Form
    {
    protected:
    Button *btnCloseAll;
    ColumnHeader *ColumnHeader2;
    ColumnHeader *ColumnHeader1;
    Button *btnLaunch1;
    ListView *ListView1;
    Button *btnClose1;

    private:
    Process *processes[];
    static String *procName = S"Notepad";
    static String *specialFolder = Environment::GetFolderPath(Environment::SpecialFolder::System);

    public:
    Form1()
    {
    InitForm();
    }

    protected:
    void Dispose( bool disposing )
    {
    Form::Dispose(disposing);
    }

    private:
    void InitForm()
    {
    btnClose1 = new Button();
    ColumnHeader2 = new ColumnHeader();
    ColumnHeader1 = new ColumnHeader();
    btnCloseAll = new Button();
    btnLaunch1 = new Button();
    ListView1 = new ListView();
    SuspendLayout();

    //
    // btnClose1
    //
    btnClose1->Location = Point(160, 176);
    btnClose1->Name = S"btnClose1";
    btnClose1->Size = System::Drawing::Size(112, 32);
    btnClose1->TabIndex = 4;
    btnClose1->Text = S"Close Selected Process";
    btnClose1->Click += new System::EventHandler(this, btnClose1_Click);
    Controls->Add(btnClose1);

    //
    // btnCloseAll
    //
    btnCloseAll->Location = Point(160, 216);
    btnCloseAll->Name = S"btnCloseAll";
    btnCloseAll->Size = System::Drawing::Size(112, 32);
    btnCloseAll->TabIndex = 3;
    btnCloseAll->Text = S"Close All Processes";
    btnCloseAll->Click += new System::EventHandler(this, btnCloseAll_Click);
    Controls->Add(btnCloseAll);

    //
    // btnLaunch1
    //
    btnLaunch1->Location = Point(32, 176);
    btnLaunch1->Name = S"btnLaunch1";
    btnLaunch1->Size = System::Drawing::Size(112, 72);
    btnLaunch1->TabIndex = 1;
    btnLaunch1->Text = S"Start Notepad";
    btnLaunch1->Click += new System::EventHandler(this, btnLaunch1_Click);
    Controls->Add(btnLaunch1);

    //
    // ColumnHeader2
    //
    ColumnHeader2->Text = S"Process ID";
    ColumnHeader2->Width = 85;

    //
    // ColumnHeader1
    //
    ColumnHeader1->Text = S"Window Title";
    ColumnHeader1->Width = 160;

    //
    // ListView1
    //
    ListView1->Columns->Add(ColumnHeader1);
    ListView1->Columns->Add(ColumnHeader2);
    ListView1->Location = Point(22, 8);
    ListView1->MultiSelect = false;
    ListView1->Name = S"ListView1";
    ListView1->Size = System::Drawing::Size(250, 152);
    ListView1->TabIndex = 7;
    ListView1->View = View::Details;
    Controls->Add(ListView1);

    //
    // Form1
    //
    AutoScaleBaseSize = System::Drawing::Size(5, 13);
    ClientSize = System::Drawing::Size(292, 266);
    Name = S"Form1";
    Text = S"Process Example";
    Closing += new System::ComponentModel::CancelEventHandler(this, closing);
    Load += new System::EventHandler(this, Form1_Load);
    ResumeLayout(false);
    }

    void BuildList()
    {
    ListViewItem *itemAdd ;
    ListView1->Items->Clear();
    processes = Process::GetProcessesByName(procName);
    for (int i = 0; i < processes->Length; i++)
    {
    itemAdd = ListView1->Items->Add(processes[i]->MainWindowTitle);
    itemAdd->SubItems->Add(processes[i]->Id.ToString());
    }
    }

    void btnLaunch1_Click(Object *sender, EventArgs *e)
    {
    ProcessStartInfo *p = new ProcessStartInfo();
    p->FileName = String::Concat(specialFolder, S"\\eula.txt");
    p->WindowStyle = ProcessWindowStyle::Minimized ;
    Process *proc = Process::Start(p);
    proc->WaitForInputIdle();
    BuildList();
    }

    void Form1_Load(Object *sender, EventArgs *e)
    {
    }

    void btnClose1_Click(Object *sender, EventArgs *e)
    {
    try
    {
    ListViewItem *lvi = ListView1->SelectedItems->get_Item(0);
    ListViewItem::ListViewSubItem *lvsi = lvi->SubItems->get_Item(1);
    int procID = System::Convert::ToInt32(lvsi->Text);
    Process *tempProc=Process::GetProcessById(procID);
    tempProc->CloseMainWindow();
    tempProc->WaitForExit();
    BuildList();
    }
    catch(...)
    {
    MessageBox::Show(S"Select a process in the ListView before clicking this button.");
    }
    }

    void btnCloseAll_Click(Object *sender, EventArgs *e)
    {
    if (processes != 0)
    {
    for (int i = 0; i < processes->Length; i++)
    {
    processes[i]->CloseMainWindow();
    }

    ListView1->Items->Clear();
    }
    }

    void closing(Object *sender, System::ComponentModel::CancelEventArgs *e)
    {
    btnCloseAll_Click(this,e);
    }
    };
    }

    using namespace CloseApplication_mc;

    int APIENTRY WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPTSTR lpCmdLine,
    int nCmdShow)
    {
    Form1 *FormInstance = new Form1;
    Application::Run(FormInstance);

    return 0;
    }

  4. Genere y 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 el
    ListView cuadro y, a continuación, haga clic en Proceso de cierre. Esto cierra la instancia específica del Bloc de notas que seleccionó. También puede hacer clic en Cerrar todos los procesos para cerrar todas las instancias de Bloc de notas que se ejecutan.
Nota: En este artículo se utiliza la propiedad Id de la clase Process para diferenciar entre instancias de la aplicación. La propiedad Id es buena para esta tarea porque todos los Id. Puede utilizar la propiedad WindowHandle de un objeto de proceso para obtener los mismos resultados. Aunque puede utilizar otras propiedades, son menos adecuadas para esta tarea. Si no conoce el identificador de proceso, o si tiene el identificador de la ventana principal, también puede utilizar la propiedad MainWindowTitle para ayudar a identificar la instancia correcta. Sin embargo, porque la propiedad MainWindowTitle puede no ser única, no puede garantizar que se hace referencia a la ventana correcta.

Volver al principio

Referencias

Para obtener más información, consulte la página de "Clase Process" en el siguiente sitio Web de Microsoft Developer Network (MSDN):
Volver al principio
Propiedades

Id. de artículo: 307395 - Última revisión: 9 ene. 2017 - Revisión: 1

Comentarios