Compartir a través de


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

En el siguiente procedimiento, se muestra cómo controlar eventos relacionados con ventanas utilizando un complemento de Visual Studio.

NotaNota

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 Importar y exportar configuraciones en el menú Herramientas.Para obtener más información, vea Personalizar la configuración de desarrollo en Visual Studio.

Para controlar eventos relacionados con ventanas mediante Visual Basic

  1. Cree un proyecto de complemento de Visual Studio mediante Visual Basic.

  2. En la clase Connect, inicialice una variable para controlar el objeto WindowEvents y otra variable para almacenar un objeto OutputWindowPane.

    Public WithEvents winEvents As EnvDTE.WindowEvents
    Private outputWinPane As OutputWindowPane
    

    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.

  3. En el método OnConnection, inicialice una variable para interceptar eventos. En el siguiente ejemplo, esta variable se denomina events.

    Dim events As EnvDTE.Events
    events = _applicationObject.Events
    
  4. Recupere los objetos de evento del modelo de automatización.

    winEvents = CType(events.WindowEvents(Nothing), EnvDTE.WindowEvents)
    

    Visual Studio conecta automáticamente el controlador de métodos, porque la declaración de la variable de objeto utiliza el controlador WithEvents (Visual Basic).

  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, se debería utilizar:

    Private Sub windowsEvents_WindowClosing(ByVal Window As _
    EnvDTE.Window) Handles winEvents.WindowClosing
        outputWinPane.OutputString("WindowEvents.WindowClosing" & _
        ControlChars.Lf)
        outputWinPane.OutputString(ControlChars.Tab & "Window: " & _
        Window.Caption & ControlChars.Lf)
    End Sub
    

    En el caso del objeto WindowEvents, debe tener los procedimientos de WindowActivated, WindowClosing, WindowCreated y WindowMoved. El código completo se muestra en el ejemplo que aparece a continuación.

  6. 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 Basic, esto se hace estableciendo el controlador de eventos en Nothing.

    Public Sub OnDisconnection(ByVal disconnectMode As _
    ext_DisconnectMode, ByRef custom As Array) Implements _
    IDTExtensibility2.OnDisconnection
        winEvents = Nothing
    End Sub
    

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

Imports System
Imports Microsoft.VisualStudio.CommandBars
Imports Extensibility
Imports EnvDTE
Imports EnvDTE80

Public Class Connect
    Implements IDTExtensibility2
    ' Handle window events.
    Public WithEvents winEvents As EnvDTE.WindowEvents
    Private outputWinPane As OutputWindowPane

    Dim _applicationObject As DTE2
    Dim _addInInstance As AddIn

    Public Sub OnConnection(ByVal application As Object, ByVal _
    connectMode As ext_ConnectMode, ByVal addInInst As Object, ByRef _
    custom As Array) Implements IDTExtensibility2.OnConnection
        _applicationObject = CType(application, DTE2)
        _addInInstance = CType(addInInst, AddIn)

        Dim events As EnvDTE.Events
        events = _applicationObject.Events
        ' Send event messages to the Output window.
        Dim outputWindow As OutputWindow
        outputWindow = CType(_applicationObject.Windows.Item _
        (Constants.vsWindowKindOutput).Object, EnvDTE.OutputWindow)
        outputWinPane = outputWindow.OutputWindowPanes.Add( _
           "DTE Event Information")

        ' Retrieve the event objects from the automation model.
        ' Visual Basic automatically connects the method handler 
        ' because the object variable declaration uses the 'WithEvents'
        ' handler.
        winEvents = CType(events.WindowEvents(Nothing), _
        EnvDTE.WindowEvents)
    End Sub

    ' Handle all window-related events.
    Private Sub windowsEvents_WindowActivated(ByVal GotFocus As _
    EnvDTE.Window, ByVal LostFocus As EnvDTE.Window) Handles _
    winEvents.WindowActivated
        outputWinPane.OutputString("WindowEvents.WindowActivated" & _
        ControlChars.Lf)
        outputWinPane.OutputString(ControlChars.Tab  _
        & "Window receiving focus: " & GotFocus.Caption  _
        & ControlChars.Lf)
        outputWinPane.OutputString _
        (ControlChars.Tab & "Window that lost focus: " _
        & LostFocus.Caption & ControlChars.Lf)
    End Sub

    Private Sub windowsEvents_WindowClosing(ByVal Window As _
    EnvDTE.Window) Handles winEvents.WindowClosing
        outputWinPane.OutputString("WindowEvents.WindowClosing" & _
        ControlChars.Lf)
        outputWinPane.OutputString(ControlChars.Tab & "Window: " & _
        Window.Caption & ControlChars.Lf)
    End Sub

    Private Sub windowsEvents_WindowCreated(ByVal Window As _
    EnvDTE.Window) Handles winEvents.WindowCreated
        outputWinPane.OutputString("WindowEvents.WindowCreated" & _
        ControlChars.Lf)
        outputWinPane.OutputString(ControlChars.Tab & "Window: " & _
        Window.Caption & ControlChars.Lf)
    End Sub

    Private Sub windowsEvents_WindowMoved(ByVal Window As _
    EnvDTE.Window, ByVal Top As Integer, ByVal Left As Integer, ByVal _
    [Width] As Integer, ByVal Height As Integer) Handles _
    winEvents.WindowMoved
        outputWinPane.OutputString("WindowEvents.WindowMoved" & _
        ControlChars.Lf)
        outputWinPane.OutputString(ControlChars.Tab & "Window: " & _
        Window.Caption & ControlChars.Lf)
        outputWinPane.OutputString(ControlChars.Tab & "Location: (" & _
        Top.ToString() & " , " & Left.ToString() & " , " & _
        Width.ToString() & " , " & Height.ToString() & ")" & _
        ControlChars.Lf)
    End Sub

    Public Sub OnDisconnection(ByVal disconnectMode As _
    ext_DisconnectMode, ByRef custom As Array) Implements _
    IDTExtensibility2.OnDisconnection
        ' Turns off window event handling when the add-in shuts down.
        winEvents = Nothing
    End Sub

    Public Sub OnAddInsUpdate(ByRef custom As Array) Implements _
    IDTExtensibility2.OnAddInsUpdate
    End Sub

    Public Sub OnStartupComplete(ByRef custom As Array) Implements _
    IDTExtensibility2.OnStartupComplete
    End Sub

    Public Sub OnBeginShutdown(ByRef custom As Array) Implements _
    IDTExtensibility2.OnBeginShutdown
    End Sub
End Class

Compilar el código

Para compilar este código, cree un nuevo proyecto de complemento de Visual Studio en Visual Basic y reemplace el código de la clase Connect por el código del ejemplo. Para obtener información sobre cómo ejecutar el complemento, vea Cómo: Controlar complementos con el Administrador de complementos.

Vea también

Tareas

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

Otros recursos

Responder a eventos de automatización