为什么我在visual studio 2005/2008中失去了输入焦点

时间:2010-10-23 03:18:51

标签: visual-studio visual-studio-2008 visual-studio-2005 visual-studio-addins

我为Visual Studio 2005/2008编写了一个加载项。它将提示一个带有一些编辑控件的窗口作为子窗口。但如果打开VS

  1. 使用文档然后打开我的加载项,当键入Tab / Delete / Backsapace / Ctrl-C等时,这些子编辑控件将失去输入焦点。
  2. 没有任何文档,然后打开我的加载项,没关系。
  3. 我想我找到了原因。如果我删除VS中的命令绑定,例如命令Edit.InsertTab与Tab绑定,那么当我在加载项中键入Tab时,输入焦点不会丢失。

    我尝试用模态对话框替换我的加载项窗口,这对我来说很惊讶,输入焦点不会丢失。

    我想知道原因。而且我不想使用对话框。任何人都可以告诉我如何解决它。感谢。

1 个答案:

答案 0 :(得分:3)

之所以如此,是因为键盘输入在Visual Studio中的路由非常复杂。

Visual Studio消息循环将为Windows消息(不包括字母数字输入)提供Visual Studio命令的优先级。它将调用活跃IOleCommandTarget的{​​{1}}链。您提到的密钥由编辑器的某些部分专门处理,因此它们优先,处理消息并导致您的输入失去焦点。

解决此问题的方法是将IVsTextView实例添加到活动视图的IOleCommandTarget OLE命令目标链中。当您的窗口处于活动状态时,您可以截取给定的键,将它们标记为已禁用,然后它们将被路由到您的窗口。

我很乐意在这里提供一个小代码片段,但不幸的是,没有一个小代码片段可以充分展示这个解决方案。相反,我会指出你在Visual Studio的Vim模拟器中使用的相同技巧。