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.
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 mediante Visual Basic
Cree un proyecto de complemento de Visual Studio mediante Visual Basic.
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.
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
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).
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.
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#)