Procedura: gestire gli eventi di automazione (Visual Basic)
Nella procedura seguente viene illustrato come gestire gli eventi relativi alle finestre utilizzando un componente aggiuntivo di Visual Studio.
Nota
È possibile che le finestre di dialogo e i comandi di menu visualizzati siano diversi da quelli descritti nella Guida a seconda delle impostazioni attive o dell'edizione del programma. Queste procedure sono state sviluppate con le Impostazioni generali per lo sviluppo attive. Per modificare le impostazioni, scegliere Importa/Esporta impostazioni dal menu Strumenti. Per ulteriori informazioni, vedere Gestione delle impostazioni.
Per gestire gli eventi relativi a finestre mediante Visual Basic
Creare un progetto di componente aggiuntivo Visual Studio utilizzando Visual Basic.
Nella classe Connect inizializzare una variabile per gestire l'oggetto WindowEvents e un'altra per archiviare un oggetto OutputWindowPane.
Public WithEvents winEvents As EnvDTE.WindowEvents Private outputWinPane As OutputWindowPane
In questo esempio la variabile è denominata winEvents. Altri oggetti presenti nel modello di automazione sono correlati ad altri tipi di eventi. L'oggetto FindEvents può, ad esempio, essere applicato ad eventi correlati a operazioni di ricerca, mentre l'oggetto TaskListEvents può essere applicato a eventi correlati all'elenco attività. Per un elenco completo di eventi disponibili, vedere Risposta a eventi di automazione.
Nel metodo OnConnection inizializzare una variabile per intercettare gli eventi. Nell'esempio seguente la variabile è denominata events.
Dim events As EnvDTE.Events events = _applicationObject.Events
Recuperare gli oggetti evento dal modello di automazione.
winEvents = CType(events.WindowEvents(Nothing), EnvDTE.WindowEvents)
Visual Studio si connette automaticamente al gestore metodi perché la dichiarazione della variabile oggetto utilizza il gestore WithEvents (Visual Basic).
Aggiungere routine per ogni evento correlato all'oggetto evento. Per gestire l'evento che viene generato alla chiusura di una finestra, ad esempio, si utilizzerebbe:
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
Nel caso dell'oggetto WindowEvents, è necessario disporre di routine per gli eventi WindowActivated, WindowClosing, WindowCreated e WindowMoved. Nell'esempio riportato di seguito è elencato il codice completo.
Infine, per evitare che dopo la chiusura del componente aggiuntivo Visual Studio rallenti le prestazioni del computer a causa del costante monitoraggio degli eventi relativi alle finestre, disabilitare la gestione degli eventi nel metodo OnDisconnection. Per eseguire questa operazione in Visual Basic, impostare il gestore eventi su Nothing.
Public Sub OnDisconnection(ByVal disconnectMode As _ ext_DisconnectMode, ByRef custom As Array) Implements _ IDTExtensibility2.OnDisconnection winEvents = Nothing End Sub
La gestione degli eventi viene disabilitata sia che il componente aggiuntivo o l'IDE venga arrestato quando il componente aggiuntivo è ancora in esecuzione. Prima che l'IDE venga arrestato, vengono arrestati automaticamente tutti i componenti aggiuntivi in esecuzione.
Esempio
Nell'esempio riportato di seguito è illustrato un componente aggiuntivo di Visual Studio di base per l'intercettazione e la gestione degli eventi relativi a finestre in Visual Studio. Ogni volta che vengono generati eventi relativi a finestre, un messaggio di notifica viene inviato alla finestra di output.
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
Compilazione del codice
Per compilare il codice, creare un nuovo progetto di componente aggiuntivo di Visual Studio in Visual Basic e sostituire il codice della classe Connect con il codice riportato nell'esempio. Per informazioni su come eseguire il componente aggiuntivo, vedere Procedura: controllare i componenti aggiuntivi tramite Gestione componenti aggiuntivi.
Vedere anche
Attività
Procedura: gestire gli eventi di automazione (Visual C#)