Freigeben über


Gewusst wie: Behandeln von Automatisierungsereignissen (Visual Basic)

Die folgende Prozedur veranschaulicht das Behandeln fensterbezogener Ereignisse mithilfe eines Visual Studio-Add-Ins.

Hinweis

Je nach den aktiven Einstellungen oder der Version unterscheiden sich die Dialogfelder und Menübefehle auf Ihrem Bildschirm möglicherweise von den in der Hilfe beschriebenen.Bei der Entwicklung dieser Verfahren war die Option Allgemeine Entwicklungseinstellungen aktiviert.Wählen Sie im Menü Extras die Option Einstellungen importieren und exportieren aus, um die Einstellungen zu ändern.Weitere Informationen finden Sie unter Anpassen der Entwicklungseinstellungen in Visual Studio.

So behandeln Sie fensterbezogene Ereignisse mit Visual Basic

  1. Erstellen Sie in Visual Basic ein Visual Studio-Add-In-Projekt.

  2. Initialisieren Sie in der Connect-Klasse eine Variable zum Behandeln des WindowEvents-Objekts und eine weitere Variable zum Speichern eines OutputWindowPane-Objekts.

    Public WithEvents winEvents As EnvDTE.WindowEvents
    Private outputWinPane As OutputWindowPane
    

    In diesem Beispiel hat die Variable den Namen winEvents. Andere Objekte im Automatisierungsmodell beziehen sich auf andere Ereignistypen. So gilt FindEvents für Ereignisse in Bezug auf Suchvorgänge, und TaskListEvents gilt für Ereignisse in Bezug auf die Aufgabenliste. Eine vollständige Liste der verfügbaren Ereignisse finden Sie unter Reagieren auf Automatisierungsereignisse.

  3. Initialisieren Sie in der OnConnection-Methode eine Variable, um Ereignisse abzufangen. Im nachfolgenden Beispiel hat diese Variable den Namen events.

    Dim events As EnvDTE.Events
    events = _applicationObject.Events
    
  4. Rufen Sie die Ereignisobjekte vom Automatisierungsmodell ab.

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

    Visual Studio stellt automatisch die Verbindung zum Methodenhandler her, da die Deklaration der Objektvariablen den WithEvents (Visual Basic)-Handler verwendet.

  5. Fügen Sie Verfahren für jedes auf das Ereignisobjekt bezogene Ereignis hinzu. Um beispielsweise das Ereignis zu behandeln, das beim Schließen eines Fensters auftritt, verwenden Sie folgenden Code:

    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
    

    Im Fall des WindowEvents-Objekts sind Prozeduren für WindowActivated, WindowClosing, WindowCreated und WindowMoved erforderlich. Der vollständige Code wird im nachfolgenden Beispiel aufgelistet.

  6. Um schließlich zu verhindern, dass Visual Studio nach Schließen des Add-Ins durch die fortdauernde Überwachung fensterbezogener Ereignisse die Systemleistung beeinträchtigt, deaktivieren Sie die Ereignisbehandlung. Dazu legen Sie in Visual Basic den Ereignishandler auf Nothing fest.

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

    Dadurch wird die Ereignisbehandlung unabhängig davon deaktiviert, ob das Add-In oder die integrierte Entwicklungsumgebung (Integrated Development Environment – IDE) heruntergefahren wird, während das Add-In ausgeführt wird. Wenn die IDE heruntergefahren wird, werden automatisch alle ausgeführten Add-Ins zuerst beendet.

Beispiel

Das folgende Beispiel mit einem grundlegenden Visual Studio-Add-In veranschaulicht das Abfangen und Behandeln fensterbezogener Ereignisse in Visual Studio. Sobald ein fensterbezogenes Ereignis auftritt, wird an das Ausgabefenster eine Benachrichtigung gesendet.

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

Kompilieren des Codes

Um diesen Code zu kompilieren, erstellen Sie in Visual Basic ein neues Visual Studio-Add-In-Projekt und ersetzen den Code der Connect-Klasse durch den Code im Beispiel. Informationen zum Ausführen des Add-Ins finden Sie unter Gewusst wie: Steuern von Add-Ins mit dem Add-In-Manager.

Siehe auch

Aufgaben

Gewusst wie: Behandeln von Automatisierungsereignissen (Visual C#)

Weitere Ressourcen

Reagieren auf Automatisierungsereignisse