从一个VS2008 VSPackage中,如何在插入符位置改变时得到通知?

6
我希望在活动的文本视图中每当插入符号位置改变时能够收到通知。看起来 EnvDTE 提供的唯一事件是 LineChanged 事件,但是它在同一行内左右移动插入符号时不会触发。
我知道 VS2010 的编辑器扩展可以轻松完成这项任务,但是我需要一个向后兼容 VS2008 的解决方案。

你是否有可用的 IVsTextView 引用? - Simon Mourier
是的,我注意到我可以使用.GetSelection(...)从中获取插入符号/选择位置,但找不到通知我它何时更改的事件。 - Omer Raviv
我认为你在VS2008中没有可用的那些信息。你能得到的唯一插入符事件是来自IVsTextViewEvents的OnCaretChangeLine。你将不得不在时间内测量两个事件之间的插入符位置。 - Simon Mourier
@SimonMourier 嗯,肯定有办法的,因为有许多扩展(Resharper、CodeRush)可以在VS2008中工作,并对每个插入符移动做出反应。 - Omer Raviv
1
好的,是的,有至少一种方法就像我说的那样。只需创建一个计时器并测量插入符号位置即可。R#和CodeRush是使用许多技巧和黑客的大型软件包。它们能够做某些事情并不意味着易于操作或得到官方支持。 - Simon Mourier
2个回答

1

你看过这个吗:DTE2事件不触发

你必须保留事件对象的本地实例,否则事件将不会触发(我认为是因为COM支持的事件对象超出了范围并被GC回收):

public class MyVSPackage
{ 
   TextEditorEvents _textEditorEvents;

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

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

是的,我知道 - 但正如我在原帖中所写的那样,当行改变时才会发生LineChanged事件,而不是列改变。无论如何还是谢谢! - Omer Raviv
抱歉,如果将dte.Events转换为EnvDTE80.Events2,您将获得对TextDocumentKeyPressEvents的访问权限,该事件具有AfterKeyPress事件。你尝试过这个吗?(dte.Events as Events2).TextDocumentKeyPressEvents.AfterKeyPress += (keypress, selection, completion) => - Philip Pittle
不幸的是,这也行不通,因为AfterKeyPress并不会对所有按键触发(特别是箭头键不会触发它,因为它们在Visual Studio内部命令处理代码中被提前处理)。 - Omer Raviv

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接