Aracılığıyla paylaş


Nasıl yapılır: tanıtıcı Otomasyon olaylarýna (Visual C#)

Aşağıdaki yordamı kullanarak pencere ile ilgili olayları işlemek gösteren bir Visual C# eklentisi.

Not

Gördüğünüz iletişim kutuları ve menü komutları, etkin ayarlarınıza ve ürün sürümüne bağlı olarak Yardım menüsünde açıklanana göre farklılık gösterebilir.Bu yordamlar, genel geliştirme ayarları ile etkin geliştirilmiştir.Ayarlarınızı değiştirmek için Araçlar menüsünden İçeri ve Dışarı Aktarma Ayarları'nı seçin.Daha fazla bilgi için bkz. Visual Studio ayarları.

Visual C# kullanarak pencere ile ilgili olayları işlemek için

  1. Oluşturma bir Visual Studio eklentisini kullanarak proje Visual C#.

  2. De OnConnection yöntemi, bir değişkeni olayların ele alınması için başlatma. Aşağıdaki örnekte, olaylar bu değişken adı verilir.

    EnvDTE.Events events = _applicationObject.Events;
    
  3. De OnConnection yöntemi, olay nesnelerini Otomasyon modelinden almak.

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

    Bu örnekte, değişken adı verilen winEvents. Otomasyon modelindeki diğer nesneleri başka tür olaylar ilgilidir. Örneğin, FindEvents işlemleri bulmak için ilgili olaylar için geçerlidir ve TaskListEvents ilgili olayları uygulandığı Task List. Kullanılabilir olaylar tam listesi için bkz: Otomasyon olaylarını yanıtlama.

  4. De OnConnection yöntemi, her temsilci += işlecini kullanarak adımı üç (3) alınan olay nesnelerinden sergilenen bağlanın. Temsilciler bağlanmak için örneğin, sergilenen tarafından WindowClosing olay, kullandığınız:

    winEvents.WindowClosing += new  
    _dispWindowEvents_WindowClosingEventHandler(this.WindowClosing);
    
  5. Her olay için olay nesnesi ilgili yordamlar ekleyin. Örneğin, bir pencere olduğunda meydana gelen olayı işlemek için kapalı (WindowClosing), kullanacağınız:

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

    Durumunda WindowEvents nesne olması gerekir, olayların tüm yordamlar gibi:

  6. Son olarak, önlemek için Visual Studio sisteminizin eklenti kapattıktan sonra pencere ile ilgili olayları izlemek devam ederseniz yavaşlatmalarını, olay işleme devre dışı. De Visual C#, bu-= işlecini kullanarak yapılır. Örneğin, devre dışı bırakma olay işleme için için WindowClosing kullanacağınız:

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

    Eklentiyi kapatmak ya da eklenti çalışmayı sürdürürken IDE kapatma olay işleme devre dışı bırakır. Tüm çalışan eklentiler IDE kapatıldığında, ilk otomatik olarak bilgisayarı.

Örnek

Aşağıdaki örnek bir temel olan Visual C# müdahale ve pencere ile ilgili olayları işlemek gösterilmiştir eklentisini Visual Studio. Pencere ile ilgili olaylar meydana geldiinde uyarı iletisi gönderilir Çıkış pencere.

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

Kod Derleniyor

Bu kodu derlemeye yeni bir oluşturmak Visual C# eklenti projesi ve örnek kodda Connect sýnýfý kodla Değiştir.

Ayrıca bkz.

Görevler

Nasıl yapılır: (Visual Basic) Otomasyon olayları işlemek

Başvuru

+= İşleci (C# Reference)

Diğer Kaynaklar

Otomasyon olaylarını yanıtlama

(Visual Basic ve Visual C# Projects) olaylarını yanıtlama