Compartir a través de


Cómo: Controlar eventos de automatización (Visual C#)

Actualización: noviembre 2007

El siguiente procedimiento 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 desarrollaron con la Configuración general de desarrollo activa. Para cambiar la configuración, elija la opción Importar y exportar configuraciones del menú Herramientas. Para obtener más información, vea Valores de configuración de Visual Studio.

Para controlar eventos relacionados con ventanas utilizando Visual C#

  1. Cree un proyecto de complemento de Visual Studio utilizando Visual C#.

  2. 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;
    
  3. 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.

  4. 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);
    
  5. 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:

  6. Finalmente, para evitar que Visual Studio haga más lento el funcionamiento del sistema al seguir supervisando los eventos relacionados con ventanas después de cerrar el complemento, deshabilite el control de eventos. En Visual C#, esto se realiza con 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 Resultados.

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#)

Otros recursos

Responder a eventos de automatización

Responder a eventos (Proyectos de Visual Basic y Visual C#)