Condividi tramite


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#

  1. Creare un progetto di componente aggiuntivo Visual Studio utilizzando Visual C#.

  2. Nel metodo OnConnection inizializzare una variabile per intercettare gli eventi. Nell'esempio la variabile è denominata events.

    EnvDTE.Events events = _applicationObject.Events;
    
  3. 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.

  4. 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);
    
  5. 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:

  6. 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#)

Altre risorse

Risposta a eventi di automazione

Risposta agli eventi (progetti Visual Basic e Visual C#)