【问题标题】:Why I lost input focus in visual studio 2005/2008为什么我在 Visual Studio 2005/2008 中失去了输入焦点
【发布时间】:2010-10-23 03:18:50
【问题描述】:

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

  1. 使用文档然后打开我的加载项,当键入 Tab/Delete/Backsapace/Ctrl-C 等时,那些子编辑控件将失去输入焦点。
  2. 不带任何文件再打开我的Add-In,就OK了。

我想我找到了原因。如果我在 VS 中删除了一个命令绑定,比如命令 Edit.InsertTab 与 Tab 绑定,那么当我在我的 Add-In 中键入 Tab 时,输入焦点不会丢失。

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

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

【问题讨论】:

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


    【解决方案1】:

    原因是由于键盘输入在 Visual Studio 内部的路由方式非常复杂。

    Visual Studio 消息循环将 Windows 消息(不包括字母数字输入)的第一优先级提供给 Visual Studio 命令。它将为活动的IVsTextView 调用IOleCommandTarget 链。您提到的键由编辑器的某些部分特别处理,因此它们优先处理消息并导致您的输入失去焦点。

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

    我很想在这里提供一个小代码 sn-p,但不幸的是,没有小代码 sn-p 可以充分展示此解决方案。相反,我将向您指出我在 Visual Studio 的 Vim 模拟器中使用的相同技巧。

    【讨论】:

    • 非常感谢。哇,你是 VsVim 的作者。我是 Windows 编程的新手。而且,你能告诉我为什么模态对话框没有问题吗?
    • @Cook,说实话,我不明白为什么模态对话框不是问题。这可能是因为当模式对话框处于活动状态时 Visual Studio 特殊情况输入(在某些情况下会这样做),或者消息只是被路由到模式对话框的消息循环中,而 Visual Studio 的主消息循环看不到它。不过我的赌注是前者。
    猜你喜欢
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    相关资源
    最近更新 更多