How to: Manipular eventos de automação (Visual C#)
O procedimento a seguir demonstra como manipular eventos relacionados à janela usando um Visual C# add-in.
Observação |
---|
As caixas de diálogo e comandos de menu demonstradas podem ser diferentes daqueles descritos na Ajuda, dependendo das configurações ativas ou configurações de edição. Esses procedimentos foram desenvolvidos com o General Development Settings ativo. Para alterar as configurações, escolha Import and Export Settings sobre o Ferramentas menu. Para obter mais informações, consulte Trabalhando com configurações. |
Para manipular eventos relacionados à janela, usando o Visual C#
Criar um Visual Studio projeto por meio de Visual C#.
No OnConnection método, inicializar uma variável para interceptar eventos. No exemplo abaixo, essa variável é chamada de eventos.
EnvDTE.Events events = _applicationObject.Events;
No OnConnection método, recuperar os objetos de eventos do modelo de automação.
winEvents = (EnvDTE.WindowEvents)events.get_WindowEvents(null);
Neste exemplo, a variável é chamada de winEvents. Outros objetos no modelo de automação referem-se a outros tipos de eventos. Por exemplo, FindEvents se aplica a eventos relacionados a operações, localizar e TaskListEvents se aplica a eventos relacionados ao Lista de tarefas. Para obter uma lista completa de eventos disponíveis, consulte Respondendo a eventos de automação.
No OnConnection método, conectar-se a cada delegado exposto em objetos de evento do recuperada na etapa três (3) usando o operador + =. Por exemplo conectar os delegados expostos pelo WindowClosing evento, você usaria:
winEvents.WindowClosing += new _dispWindowEvents_WindowClosingEventHandler(this.WindowClosing);
Adicione os procedimentos para cada evento relacionados ao objeto de evento. Por exemplo manipular o evento que ocorre quando uma janela é fechada (WindowClosing), você usaria:
public void WindowClosing(EnvDTE.Window closingWindow) { outputWindowPane.OutputString ("WindowEvents::WindowClosing\n"); outputWindowPane.OutputString("\tWindow: " + closingWindow.Caption + "\n"); }
No caso do WindowEvents o objeto, você deve ter procedimentos para todos os seus eventos, ou seja:
Finalmente, para evitar Visual Studio da redução do seu sistema, continuando a monitorar eventos de janela depois de fechar o add-in, desativar tratamento de evento. Em Visual C#, isso é feito usando o operador de-=. Por exemplo, para desabilitar a manipulação de eventos para WindowClosing você usaria:
public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom) { if (winEvents != null) { winEvents.WindowClosing -= new _dispWindowEvents_WindowClosingEventHandler (this.WindowClosing); } }
Isso desativa o tratamento de eventos se o suplemento está desligado ou o IDE for desligado enquanto o add-in ainda está em execução. Quando o IDE for desligado, o todos os suplementos em execução são desligados automaticamente primeiro.
Exemplo
O exemplo a seguir é um basic Visual C# add-in que demonstra como interceptar e manipular eventos relacionados à janela, em Visual Studio. Sempre que ocorrerem eventos relacionados à janela, uma mensagem de notificação é enviada para o saída janela.
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;
}
}
Compilando o código
Para compilar esse código, crie um novo Visual C# add-in do projeto e substitua o código da classe de conectar-se com o código de exemplo.
Consulte também
Tarefas
How to: Manipular eventos de automação (Visual Basic)
Referência
+= Operador de (TRANSLATION FROM VPE FOR CSHARP Reference)
Outros recursos
Respondendo a eventos de automação
Respondendo a eventos (Visual Basic e projetos do Visual C#)