Procedura: gestire gli eventi di automazione (Visual C#)
Nella procedura seguente viene illustrato come gestire gli eventi relativi alle finestre utilizzando un componente aggiuntivo di Visual C#.
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 C#
Creare un progetto di componente aggiuntivo Visual Studio utilizzando Visual C#.
Nel metodo OnConnection inizializzare una variabile per intercettare gli eventi. Nell'esempio la variabile è denominata events.
EnvDTE.Events events = _applicationObject.Events;
Recuperare gli oggetti evento dal modello di automazione nel metodo OnConnection.
winEvents = (EnvDTE.WindowEvents)events.get_WindowEvents(null);
Nell'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 stabilire la connessione a ogni delegato esposto dagli oggetti evento recuperati nel passaggio tre (3) mediante l'operatore +=. Per connettere i delegati esposti dall'evento WindowClosing, ad esempio, si utilizzerebbe:
winEvents.WindowClosing += new _dispWindowEvents_WindowClosingEventHandler(this.WindowClosing);
Aggiungere routine per ogni evento correlato all'oggetto evento. Per gestire l'evento che viene generato alla chiusura di una finestra (WindowClosing), ad esempio, si utilizzerebbe:
public void WindowClosing(EnvDTE.Window closingWindow) { outputWindowPane.OutputString ("WindowEvents::WindowClosing\n"); outputWindowPane.OutputString("\tWindow: " + closingWindow.Caption + "\n"); }
Nel caso dell'oggetto WindowEvents, è necessario disporre di routine per tutti gli eventi relativi, nello specifico:
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. In Visual C# questo risultato viene ottenuto mediante l'operatore -=. Per disabilitare la gestione degli eventi per WindowClosing, ad esempio, si utilizzerebbe:
public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom) { if (winEvents != null) { winEvents.WindowClosing -= new _dispWindowEvents_WindowClosingEventHandler (this.WindowClosing); } }
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 C# 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.
namespace CSEventsAddin
{
using System;
using Microsoft.VisualStudio.CommandBars;
using Extensibility;
using EnvDTE;
using EnvDTE80;
public class Connect : Object, IDTExtensibility2
{
public Connect()
{
}
public void OnConnection(object application, ext_ConnectMode
connectMode, object addInInst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
// Retrieve the event objects from the automation model.
EnvDTE.Events events = _applicationObject.Events;
// Send event messages to the Output window.
OutputWindow outputWindow =
(OutputWindow)_applicationObject.Windows.Item
(Constants.vsWindowKindOutput).Object;
outputWindowPane = outputWindow.OutputWindowPanes.Add("DTE
Event Information");
// Retrieve the event objects from the automation model.
winEvents =
(EnvDTE.WindowEvents)events.get_WindowEvents(null);
// Connect to each delegate exposed from each object
// retrieved above.
winEvents.WindowActivated += new
_dispWindowEvents_WindowActivatedEventHandler
(this.WindowActivated);
winEvents.WindowClosing += new
_dispWindowEvents_WindowClosingEventHandler
(this.WindowClosing);
winEvents.WindowCreated += new
_dispWindowEvents_WindowCreatedEventHandler
(this.WindowCreated);
winEvents.WindowMoved += new
_dispWindowEvents_WindowMovedEventHandler
(this.WindowMoved);
}
public void OnDisconnection(ext_DisconnectMode disconnectMode,
ref Array custom)
{
// If the delegate handlers have been connected, then
// disconnect them here.
// If this is not done, the handlers may still
// fire until the next garbage collection event.
if (winEvents != null)
{
winEvents.WindowActivated -= new
_dispWindowEvents_WindowActivatedEventHandler
(this.WindowActivated);
winEvents.WindowClosing -= new
_dispWindowEvents_WindowClosingEventHandler
(this.WindowClosing);
winEvents.WindowCreated -= new
_dispWindowEvents_WindowCreatedEventHandler
(this.WindowCreated);
winEvents.WindowMoved -= new
_dispWindowEvents_WindowMovedEventHandler
(this.WindowMoved);
}
}
// Window-related events.
public void WindowClosing(EnvDTE.Window closingWindow)
{
outputWindowPane.OutputString
("WindowEvents::WindowClosing\n");
outputWindowPane.OutputString("\tWindow: " +
closingWindow.Caption + "\n");
}
public void WindowActivated(EnvDTE.Window gotFocus,
EnvDTE.Window lostFocus)
{
outputWindowPane.OutputString
("WindowEvents::WindowActivated\n");
outputWindowPane.OutputString("\tWindow receiving focus: "
+ gotFocus.Caption + "\n");
outputWindowPane.OutputString("\tWindow that lost focus: "
+ lostFocus.Caption + "\n");
}
public void WindowCreated(EnvDTE.Window window)
{
outputWindowPane.OutputString
("WindowEvents::WindowCreated\n");
outputWindowPane.OutputString("\tWindow: " + window.Caption
+ "\n");
}
public void WindowMoved(EnvDTE.Window window, int top, int
left, int width, int height)
{
outputWindowPane.OutputString
("WindowEvents::WindowMoved\n");
outputWindowPane.OutputString("\tWindow: " + window.Caption
+ "\n");
outputWindowPane.OutputString("\tLocation: (" +
top.ToString() + " , " + left.ToString() + " , " +
width.ToString() + " , " + height.ToString() + ")\n");
}
public void OnAddInsUpdate(ref Array custom)
{
}
public void OnStartupComplete(ref Array custom)
{
}
public void OnBeginShutdown(ref Array custom)
{
}
private DTE2 _applicationObject;
private AddIn _addInInstance;
private EnvDTE.WindowEvents winEvents;
private OutputWindowPane outputWindowPane;
}
}
Compilazione del codice
Per compilare il codice, creare un nuovo progetto di componente aggiuntivo di Visual C# e sostituire il codice della classe Connect con il codice riportato nell'esempio.
Vedere anche
Attività
Procedura: gestire gli eventi di automazione (Visual Basic)
Riferimenti
Operatore += (Riferimenti per C#)