Udostępnij za pośrednictwem


Porady: obsługa zdarzeń automatyzacji (Visual C#)

W poniższej procedurze demonstruje, jak obsłużyć zdarzenia związane z okna za pomocą Visual C# dodatek.

[!UWAGA]

Okien dialogowych i poleceń menu, którą widzisz mogą różnić się od tych opisanych w pomocy, w zależności od tego, aktywne ustawienia lub edition.Procedury te zostały opracowane z ogólnych ustawień rozwoju aktywnych.Aby zmienić ustawienia, wybierz polecenie Importuj i Eksportuj ustawienia na Narzędzia menu.Aby uzyskać więcej informacji, zobacz Dostosowywanie ustawień środowiska deweloperskiego w Visual Studio.

Do obsługi zdarzeń związanych z okna za pomocą Visual C#

  1. Tworzenie Visual Studio dodać w projekcie przy użyciu Visual C#.

  2. W OnConnection metodę, zainicjować zmienną, aby przechwytywać zdarzenia.W poniższym przykładzie zmienna ta nosi nazwę zdarzenia.

    EnvDTE.Events events = _applicationObject.Events;
    
  3. W OnConnection metody pobierania obiektów zdarzeń z modelu automatyzacji.

    winEvents = (EnvDTE.WindowEvents)events.get_WindowEvents(null);
    

    W tym przykładzie zmienna jest nazywany winEvents.Innych obiektów w modelu automatyzacji odnoszą się do innych typów zdarzeń.Na przykład FindEvents stosuje się do zdarzeń związanych z operacji, wyszukiwania i TaskListEvents stosuje się do zdarzeń związanych z Listy zadań.Aby uzyskać pełną listę dostępnych zdarzeń, zobacz Odpowiadanie na zdarzenia automatyzacji.

  4. W OnConnection metodę, połączyć się z każdego delegata narażone z pobraną w kroku trzy (3) przy użyciu += operator obiekty zdarzeń.Na przykład, aby połączyć się z delegatów udostępniane przez WindowClosing zdarzenia, należy użyć:

    winEvents.WindowClosing += new  
    _dispWindowEvents_WindowClosingEventHandler(this.WindowClosing);
    
  5. Dodawanie procedury dla każdego zdarzenia związane z obiektu zdarzenia.Na przykład, do obsługi zdarzeń, który występuje, gdy okno jest zamknięte (WindowClosing), należy użyć:

    public void WindowClosing(EnvDTE.Window closingWindow)
    {
        outputWindowPane.OutputString ("WindowEvents::WindowClosing\n");
        outputWindowPane.OutputString("\tWindow: " + 
        closingWindow.Caption + "\n");
    }
    

    W odniesieniu do WindowEvents obiektu, musi mieć procedury dla wszystkich jego zdarzeń, a mianowicie:

  6. Wreszcie Aby zapobiec Visual Studio spowalniały one systemu poprzez kontynuowanie monitorowania zdarzeń związanych z okna, po zamknięciu dodatku, należy wyłączyć obsługę zdarzeń.W Visual C#, jest to wykonywane za pomocą operatora-=.Na przykład, aby wyłączyć obsługi zdarzeń dla WindowClosing należy użyć:

    public void OnDisconnection(ext_DisconnectMode disconnectMode, 
    ref Array custom)
    {
        if (winEvents != null)
        {
            winEvents.WindowClosing -= new 
            _dispWindowEvents_WindowClosingEventHandler     
            (this.WindowClosing);
        }
    }
    

    Ta opcja powoduje wyłączenie obsługi zdarzeń, czy dodatek jest zamknięty lub IDE jest zamknięty, podczas gdy nadal jest uruchomiony dodatek.Podczas zamykania IDE wszystkie uruchomione dodatki są automatycznie zamknięty pierwszej.

Przykład

Poniższy przykład stanowi podstawowy Visual C# dodatek, który demonstruje, jak przechwycić i obsługi zdarzeń związanych z okna w Visual Studio.W każdym przypadku, gdy wystąpią zdarzenia związane z okna, komunikat z powiadomieniem jest wysyłana do produkcji okna.

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;
    }
}

Kompilowanie kodu

Aby skompilować kod, Utwórz nowy Visual C# dodać w projekcie i Zastąp kod klasy Połącz z kodem w przykładzie.

Zobacz też

Zadania

Porady: obsługa zdarzeń automatyzacji (Visual Basic)

Informacje

+= — Operator (odwołanie w C#)

Inne zasoby

Odpowiadanie na zdarzenia automatyzacji

Odpowiadanie na zdarzenia (projekty Visual Basic oraz Visual C#)