Cómo: Controlar eventos de automatización (Visual C#)
En el siguiente procedimiento, se muestra cómo controlar eventos relacionados con ventanas utilizando un complemento de Visual C#.
Nota
Los cuadros de diálogo y comandos de menú que se ven pueden diferir de los descritos en la Ayuda, en función de los valores de configuración o de edición activos. Estos procedimientos se han desarrollado con la Configuración de desarrollo general activa. Para cambiar la configuración, elija la opción Importar y exportar configuraciones del menú Herramientas. Para obtener más información, vea Trabajar con valores de configuración.
Para controlar eventos relacionados con ventanas utilizando Visual C#
Cree un proyecto de complemento de Visual Studio mediante Visual C#.
En el método OnConnection, inicialice una variable para interceptar eventos. En el siguiente ejemplo, esta variable se denomina events.
EnvDTE.Events events = _applicationObject.Events;
En el método OnConnection, recupere los objetos de evento del modelo de automatización.
winEvents = (EnvDTE.WindowEvents)events.get_WindowEvents(null);
En este ejemplo, la variable se denomina winEvents. Otros objetos del modelo de automatización se relacionan con otros tipos de eventos. Por ejemplo, FindEvents se aplica a los eventos relacionados con las operaciones de búsqueda y TaskListEvents se aplica a los eventos relacionados con la Lista de tareas. Para obtener una lista completa de los eventos disponibles, vea Responder a eventos de automatización.
En el método OnConnection, conéctese a cada delegado expuesto a partir de los objetos de evento recuperados en el paso tres (3), utilizando el operador +=. Por ejemplo, para conectarse a los delegados expuestos por el evento WindowClosing, se debería utilizar:
winEvents.WindowClosing += new _dispWindowEvents_WindowClosingEventHandler(this.WindowClosing);
Agregue procedimientos para cada evento relacionado con el objeto de evento. Por ejemplo, para controlar el evento que se produce al cerrarse una ventana (WindowClosing), se debería utilizar:
public void WindowClosing(EnvDTE.Window closingWindow) { outputWindowPane.OutputString ("WindowEvents::WindowClosing\n"); outputWindowPane.OutputString("\tWindow: " + closingWindow.Caption + "\n"); }
En el caso del objeto WindowEvents, debe tener los procedimientos para todos sus eventos, concretamente:
Finalmente, para evitar que Visual Studio ralentice el sistema continuando la supervisión de eventos relacionados con ventanas después de cerrar el complemento, deshabilite el control de eventos. En Visual C#, lo lleva a cabo el operador -=. Por ejemplo, para deshabilitar el control de eventos de WindowClosing, se debería utilizar:
public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom) { if (winEvents != null) { winEvents.WindowClosing -= new _dispWindowEvents_WindowClosingEventHandler (this.WindowClosing); } }
De esta forma se desactiva el control de eventos si se cierra el complemento o se cierra el IDE mientras el complemento aún se está ejecutando. Cuando se cierra el IDE, en primer lugar, todos los complementos en ejecución se cierran automáticamente.
Ejemplo
En el siguiente ejemplo de complemento básico de Visual C# se muestra cómo interceptar y controlar los eventos relacionados con ventanas en Visual Studio. Siempre que se producen eventos relacionados con ventanas, se envía un mensaje de notificación a la ventana de salida.
namespace CSEventsAddin
{
using System;
using Microsoft.VisualStudio.CommandBars;
using Extensibility;
using EnvDTE;
using EnvDTE80;
public class Connect : Object, IDTExtensibility2
{
public Connect()
{
}
public void OnConnection(object application, ext_ConnectMode
connectMode, object addInInst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
// Retrieve the event objects from the automation model.
EnvDTE.Events events = _applicationObject.Events;
// Send event messages to the Output window.
OutputWindow outputWindow =
(OutputWindow)_applicationObject.Windows.Item
(Constants.vsWindowKindOutput).Object;
outputWindowPane = outputWindow.OutputWindowPanes.Add("DTE
Event Information");
// Retrieve the event objects from the automation model.
winEvents =
(EnvDTE.WindowEvents)events.get_WindowEvents(null);
// Connect to each delegate exposed from each object
// retrieved above.
winEvents.WindowActivated += new
_dispWindowEvents_WindowActivatedEventHandler
(this.WindowActivated);
winEvents.WindowClosing += new
_dispWindowEvents_WindowClosingEventHandler
(this.WindowClosing);
winEvents.WindowCreated += new
_dispWindowEvents_WindowCreatedEventHandler
(this.WindowCreated);
winEvents.WindowMoved += new
_dispWindowEvents_WindowMovedEventHandler
(this.WindowMoved);
}
public void OnDisconnection(ext_DisconnectMode disconnectMode,
ref Array custom)
{
// If the delegate handlers have been connected, then
// disconnect them here.
// If this is not done, the handlers may still
// fire until the next garbage collection event.
if (winEvents != null)
{
winEvents.WindowActivated -= new
_dispWindowEvents_WindowActivatedEventHandler
(this.WindowActivated);
winEvents.WindowClosing -= new
_dispWindowEvents_WindowClosingEventHandler
(this.WindowClosing);
winEvents.WindowCreated -= new
_dispWindowEvents_WindowCreatedEventHandler
(this.WindowCreated);
winEvents.WindowMoved -= new
_dispWindowEvents_WindowMovedEventHandler
(this.WindowMoved);
}
}
// Window-related events.
public void WindowClosing(EnvDTE.Window closingWindow)
{
outputWindowPane.OutputString
("WindowEvents::WindowClosing\n");
outputWindowPane.OutputString("\tWindow: " +
closingWindow.Caption + "\n");
}
public void WindowActivated(EnvDTE.Window gotFocus,
EnvDTE.Window lostFocus)
{
outputWindowPane.OutputString
("WindowEvents::WindowActivated\n");
outputWindowPane.OutputString("\tWindow receiving focus: "
+ gotFocus.Caption + "\n");
outputWindowPane.OutputString("\tWindow that lost focus: "
+ lostFocus.Caption + "\n");
}
public void WindowCreated(EnvDTE.Window window)
{
outputWindowPane.OutputString
("WindowEvents::WindowCreated\n");
outputWindowPane.OutputString("\tWindow: " + window.Caption
+ "\n");
}
public void WindowMoved(EnvDTE.Window window, int top, int
left, int width, int height)
{
outputWindowPane.OutputString
("WindowEvents::WindowMoved\n");
outputWindowPane.OutputString("\tWindow: " + window.Caption
+ "\n");
outputWindowPane.OutputString("\tLocation: (" +
top.ToString() + " , " + left.ToString() + " , " +
width.ToString() + " , " + height.ToString() + ")\n");
}
public void OnAddInsUpdate(ref Array custom)
{
}
public void OnStartupComplete(ref Array custom)
{
}
public void OnBeginShutdown(ref Array custom)
{
}
private DTE2 _applicationObject;
private AddIn _addInInstance;
private EnvDTE.WindowEvents winEvents;
private OutputWindowPane outputWindowPane;
}
}
Compilar el código
Para compilar este código, cree un nuevo proyecto de complemento de Visual C# y reemplace el código de la clase Connect por el código del ejemplo.
Vea también
Tareas
Cómo: Controlar eventos de automatización (Visual Basic)
Referencia
Operador += (Referencia de C#)