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
Erstellen Sie in Visual Basic ein Visual Studio-Add-In-Projekt.
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.
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
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.
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.
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#)