2013-05-15 2 views
6

Я хотел бы получать уведомление, когда позиция каретки изменилась в активном текстовом представлении. Единственное, что предлагает EnvDTE, это the LineChanged event, который, конечно же, не поднимается при перемещении курсора влево или вправо в пределах одной линии.Из VS2008 VSPackage, как мне получить уведомление, когда позиция каретки изменилась?

Я понимаю, что редактор VS2010 Extensibility позволяет вам делать это без пота, но мне нужно решение, которое обратно совместимо с VS2008.

+0

У вас есть ссылка на IVsTextView? –

+0

Да, и я заметил, что могу получить позицию каретки/выбора с помощью '.GetSelection (...)', но не смог найти событие, которое уведомляет меня об изменении. –

+0

Я не думаю, что у вас есть эта информация, доступная в VS2008. Единственное каретное событие, которое вы можете получить, - OnCaretChangeLine из IVsTextViewEvents. Вам нужно будет измерить положение каретки между двумя событиями во времени. –

ответ

0

Я нашел решение. Решением является создание IOleCommandTarget и регистрация его на IVsTextView (см. Последние два бита кода in this blog post (in Herbrew)). Затем каждый раз, когда запускается команда, я проверяю, изменилась ли позиция каретки. См. Также: this blog post - How to intercept key presses in the Visual Studio text editor

+0

Почему downvote? –

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, вы получите доступ к TextDocumentKeyPressEvents, который имеет событие AfterKeyPress. Вы пробовали это? '(dte.Events as Events2) .TextDocumentKeyPressEvents.AfterKeyPress + = (keypress, selection, completion) =>' –

+0

К сожалению, это тоже не сработает, поскольку AfterKeyPress не запускается для всех нажатий клавиш (в частности, клавиши со стрелками не запускайте его для запуска, поскольку они обрабатываются ранее во внутреннем коде обработки Visual Studio). –

 Смежные вопросы

  • Нет связанных вопросов^_^