Partager via


Comment : gérer des événements Automation (Visual Basic)

La procédure suivante montre comment gérer des événements liés aux fenêtres à l'aide d'un complément Visual Studio.

[!REMARQUE]

Les boîtes de dialogue et les commandes de menu qui s'affichent peuvent être différentes de celles qui sont décrites dans l'aide, en fonction de vos paramètres actifs ou de l'édition utilisée.Ces procédures ont été développées avec les paramètres de développement généraux actifs.Pour modifier vos paramètres, choisissez Importation et exportation de paramètres dans le menu Outils.Pour plus d'informations, consultez Paramètres Visual Studio.

Pour gérer des événements liés aux fenêtres à l'aide de Visual Basic

  1. Créez un projet de complément Visual Studio en utilisant Visual Basic.

  2. Dans la classe Connect, initialisez une variable pour gérer l'objet WindowEvents et une autre pour stocker un OutputWindowPane.

    Public WithEvents winEvents As EnvDTE.WindowEvents
    Private outputWinPane As OutputWindowPane
    

    Dans cet exemple, la variable se nomme winEvents.D'autres objets présents dans le modèle Automation sont liés à d'autres types d'événements.Par exemple, FindEvents s'applique aux événements liés aux opérations de recherche, et TaskListEvents aux événements en rapport avec la Liste des tâches.Pour obtenir une liste exhaustive des événements disponibles, consultez Réponse aux événements d'automation.

  3. Dans la méthode OnConnection, initialisez une variable pour intercepter des événements.Dans l'exemple ci-dessous, cette variable se nomme events.

    Dim events As EnvDTE.Events
    events = _applicationObject.Events
    
  4. Récupérez les objets événement du modèle Automation.

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

    Visual Studio connecte automatiquement le gestionnaire de méthodes car la déclaration de la variable objet utilise le gestionnaire WithEvents (Visual Basic).

  5. Ajoutez des procédures pour chaque événement en rapport avec l'objet événement.Par exemple, pour gérer l'événement qui se produit lorsqu'une fenêtre est fermée, vous utiliserez :

    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
    

    Dans le cas de l'objet WindowEvents, vous devez disposer de procédures pour WindowActivated, WindowClosing, WindowCreated et WindowMoved.Le code complet est présenté dans l'exemple ci-dessous.

  6. Enfin, pour empêcher Visual Studio de ralentir votre système en continuant à surveiller les événements liés aux fenêtres une fois le complément fermé, désactivez la gestion des événements.Dans Visual Basic, vous devez, pour ce faire, affecter la valeur Nothing au gestionnaire d'événements.

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

    La gestion des événements est alors désactivée si le complément est arrêté, ou si l'IDE est arrêté tandis que le complément est encore en cours d'exécution.Une fois l'IDE arrêté, tous les compléments en cours d'exécution sont fermés automatiquement en premier.

Exemple

L'exemple suivant est un complément Visual Studio de base qui montre comment intercepter et gérer des événements liés aux fenêtres dans Visual Studio.À chaque fois que des événements liés aux fenêtres se produisent, un message de notification est envoyé à la fenêtre Sortie.

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

Compilation du code

Pour compiler ce code, créez un projet de complément Visual Studio dans Visual Basic, puis remplacez le code de la classe Connect par le code de l'exemple.Pour plus d'informations sur l'exécution du complément, consultez Comment : contrôler des compléments avec le Gestionnaire de compléments.

Voir aussi

Tâches

Comment : gérer des événements Automation (Visual C#)

Autres ressources

Réponse aux événements d'automation