2013-05-15 4 views
6

활성 텍스트보기에서 캐럿 위치가 변경 될 때마다 알림을 받고 싶습니다. EnvDTE가 제공하는 것만이 the LineChanged event인데, 같은 줄에서 캐럿을 왼쪽이나 오른쪽으로 움직일 때 당연히 올라가지 않습니다.VS2008 VSPackage에서 캐럿 위치가 변경 될 때마다 어떻게 알림을 받습니까?

VS2010의 Editor Extensibility를 사용하면 땀을 흘리지 않아도되지만, VS2008과 호환되는 솔루션이 필요합니다.

+0

IVsTextView 참조를 사용할 수 있습니까? –

+0

예,'.GetSelection (...) '을 사용하여 캐럿/선택 위치를 얻을 수 있지만 변경되었을 때 알려주는 이벤트를 찾을 수 없습니다. –

+0

VS2008에서 제공되는 정보가 없다고 생각합니다. 얻을 수있는 유일한 캐럿 이벤트는 IVsTextViewEvents의 OnCaretChangeLine입니다. 두 이벤트 사이의 캐럿 위치를 시간에 측정해야합니다. –

답변

1

당신이 봤어 : 객체 DTE2 events don't fire

당신은 (백업 이벤트 오브젝트 COM이 GC'd을 범위를 벗어나 가서했기 때문에 나는 가정), 이벤트의 로컬 인스턴스를 유지하기 위해 다른 이벤트 못해 화재가 :

public class MyVSPackage 
{ 
    TextEditorEvents _textEditorEvents; 

    public MyVSPackage() 
    { 
     _textEditorEvents = DTE.Events.TextEditorEvents; 

     _textEditorEvents.LineChanged += (point, endPoint, hint) => //Do something here 
    } 
} 
+0

예, 저는 알고 있습니다. 그러나 원래 게시물에 쓴 것처럼 LineChanged는 행이 변경되었을 때만 발생하며 열이 변경되지 않은 경우에만 발생합니다. 어쨌든 고마워! –

+0

죄송합니다. dte.Events를 EnvDTE80.Events2로 형 변환하면 AfterKeyPress 이벤트가있는 TextDocumentKeyPressEvents에 액세스 할 수 있습니다. 너 그거 해봤 니? '(이벤트 2로 dte.Events) .TextDocumentKeyPressEvents.AfterKeyPress + = (keypress, selection, completion) =>' –

+0

불행하게도 AfterKeyPress가 모든 키 누름 (특히 화살표 키 Visual Studio의 내부 명령 처리 코드에서 일찍 처리되므로 트리거하지 않습니다. –