방법: 자동화 이벤트 처리(Visual Basic)
아래 절차에서는 Visual Studio 추가 기능을 사용하여 창 관련 이벤트를 처리하는 방법을 보여 줍니다.
참고
표시되는 대화 상자와 메뉴 명령은 활성 설정이나 버전에 따라 도움말에서 설명하는 것과 다를 수 있습니다.이러한 절차는 일반 개발 설정을 사용하여 개발되었습니다.설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 선택합니다.자세한 내용은 Visual Studio에서 개발 설정 사용자 지정을 참조하십시오.
Visual Basic을 사용하여 창 관련 이벤트를 처리하려면
Visual Basic을 사용하여 Visual Studio 추가 기능 프로젝트를 만듭니다.
Connect 클래스에서 WindowEvents 개체를 처리하기 위한 변수와 OutputWindowPane 개체를 저장하기 위한 변수를 각각 초기화합니다.
Public WithEvents winEvents As EnvDTE.WindowEvents Private outputWinPane As OutputWindowPane
이 예제에서 변수 이름은 winEvents입니다. 자동화 모델의 다른 개체는 다른 형식의 이벤트와 연결됩니다. 예를 들어, FindEvents는 찾기 작업과 관련된 이벤트에 적용되고 TaskListEvents는 작업 목록과 관련된 이벤트에 적용됩니다. 사용할 수 있는 이벤트의 전체 목록을 보려면 자동화 이벤트에 응답을 참조하십시오.
OnConnection 메서드에서 이벤트를 가로채는 변수를 초기화합니다. 아래 예제에서 이 변수의 이름은 events입니다.
Dim events As EnvDTE.Events events = _applicationObject.Events
자동화 모델에서 이벤트 개체를 검색합니다.
winEvents = CType(events.WindowEvents(Nothing), EnvDTE.WindowEvents)
개체 변수 선언에 WithEvents(Visual Basic) 처리기가 사용되므로 Visual Studio는 메서드 처리기를 자동으로 연결합니다.
이벤트 개체와 관련된 각 이벤트에 대한 프로시저를 추가합니다. 예를 들어, 창을 닫을 때 발생하는 이벤트를 처리하려면 다음 코드를 사용합니다.
Private Sub windowsEvents_WindowClosing(ByVal Window As _ EnvDTE.Window) Handles winEvents.WindowClosing outputWinPane.OutputString("WindowEvents.WindowClosing" & _ ControlChars.Lf) outputWinPane.OutputString(ControlChars.Tab & "Window: " & _ Window.Caption & ControlChars.Lf) End Sub
WindowEvents 개체의 경우 WindowActivated, WindowClosing, WindowCreated 및 WindowMoved 이벤트에 대한 프로시저가 필요합니다. 전체 코드는 아래 예제에 나와 있습니다.
마지막으로, 추가 기능을 닫은 후 Visual Studio에서 창 관련 이벤트를 계속 모니터링하여 시스템이 느려지지 않도록 이벤트 처리를 사용하지 않도록 설정합니다. Visual Basic에서 이 작업은 이벤트 처리기를 Nothing으로 설정하여 수행됩니다.
Public Sub OnDisconnection(ByVal disconnectMode As _ ext_DisconnectMode, ByRef custom As Array) Implements _ IDTExtensibility2.OnDisconnection winEvents = Nothing End Sub
이렇게 하면 추가 기능이 종료될 경우만이 아니라 추가 기능이 여전히 실행 중인 상태에서 IDE가 종료될 경우에도 이벤트 처리가 해제됩니다. IDE가 종료될 때에는 실행 중인 모든 추가 기능이 먼저 자동으로 종료됩니다.
예제
다음은 Visual Studio에서 창 관련 이벤트를 가로채고 처리하는 방법을 보여 주는 기본 Visual Studio 추가 기능 예제입니다. 창 관련 이벤트가 발생할 때마다 알림 메시지가 출력 창으로 전달됩니다.
Imports System
Imports Microsoft.VisualStudio.CommandBars
Imports Extensibility
Imports EnvDTE
Imports EnvDTE80
Public Class Connect
Implements IDTExtensibility2
' Handle window events.
Public WithEvents winEvents As EnvDTE.WindowEvents
Private outputWinPane As OutputWindowPane
Dim _applicationObject As DTE2
Dim _addInInstance As AddIn
Public Sub OnConnection(ByVal application As Object, ByVal _
connectMode As ext_ConnectMode, ByVal addInInst As Object, ByRef _
custom As Array) Implements IDTExtensibility2.OnConnection
_applicationObject = CType(application, DTE2)
_addInInstance = CType(addInInst, AddIn)
Dim events As EnvDTE.Events
events = _applicationObject.Events
' Send event messages to the Output window.
Dim outputWindow As OutputWindow
outputWindow = CType(_applicationObject.Windows.Item _
(Constants.vsWindowKindOutput).Object, EnvDTE.OutputWindow)
outputWinPane = outputWindow.OutputWindowPanes.Add( _
"DTE Event Information")
' Retrieve the event objects from the automation model.
' Visual Basic automatically connects the method handler
' because the object variable declaration uses the 'WithEvents'
' handler.
winEvents = CType(events.WindowEvents(Nothing), _
EnvDTE.WindowEvents)
End Sub
' Handle all window-related events.
Private Sub windowsEvents_WindowActivated(ByVal GotFocus As _
EnvDTE.Window, ByVal LostFocus As EnvDTE.Window) Handles _
winEvents.WindowActivated
outputWinPane.OutputString("WindowEvents.WindowActivated" & _
ControlChars.Lf)
outputWinPane.OutputString(ControlChars.Tab _
& "Window receiving focus: " & GotFocus.Caption _
& ControlChars.Lf)
outputWinPane.OutputString _
(ControlChars.Tab & "Window that lost focus: " _
& LostFocus.Caption & ControlChars.Lf)
End Sub
Private Sub windowsEvents_WindowClosing(ByVal Window As _
EnvDTE.Window) Handles winEvents.WindowClosing
outputWinPane.OutputString("WindowEvents.WindowClosing" & _
ControlChars.Lf)
outputWinPane.OutputString(ControlChars.Tab & "Window: " & _
Window.Caption & ControlChars.Lf)
End Sub
Private Sub windowsEvents_WindowCreated(ByVal Window As _
EnvDTE.Window) Handles winEvents.WindowCreated
outputWinPane.OutputString("WindowEvents.WindowCreated" & _
ControlChars.Lf)
outputWinPane.OutputString(ControlChars.Tab & "Window: " & _
Window.Caption & ControlChars.Lf)
End Sub
Private Sub windowsEvents_WindowMoved(ByVal Window As _
EnvDTE.Window, ByVal Top As Integer, ByVal Left As Integer, ByVal _
[Width] As Integer, ByVal Height As Integer) Handles _
winEvents.WindowMoved
outputWinPane.OutputString("WindowEvents.WindowMoved" & _
ControlChars.Lf)
outputWinPane.OutputString(ControlChars.Tab & "Window: " & _
Window.Caption & ControlChars.Lf)
outputWinPane.OutputString(ControlChars.Tab & "Location: (" & _
Top.ToString() & " , " & Left.ToString() & " , " & _
Width.ToString() & " , " & Height.ToString() & ")" & _
ControlChars.Lf)
End Sub
Public Sub OnDisconnection(ByVal disconnectMode As _
ext_DisconnectMode, ByRef custom As Array) Implements _
IDTExtensibility2.OnDisconnection
' Turns off window event handling when the add-in shuts down.
winEvents = Nothing
End Sub
Public Sub OnAddInsUpdate(ByRef custom As Array) Implements _
IDTExtensibility2.OnAddInsUpdate
End Sub
Public Sub OnStartupComplete(ByRef custom As Array) Implements _
IDTExtensibility2.OnStartupComplete
End Sub
Public Sub OnBeginShutdown(ByRef custom As Array) Implements _
IDTExtensibility2.OnBeginShutdown
End Sub
End Class
코드 컴파일
이 코드를 컴파일하려면 Visual Basic에서 새 Visual Studio 추가 기능 프로젝트를 만들고 Connect 클래스의 코드를 예제에 있는 코드로 변경합니다. 추가 기능을 실행하는 방법에 대한 내용은 방법: 추가 기능 관리자를 사용하여 추가 기능 제어를 참조하십시오.