IVsTextManager :: GetActiveView(true,null,...)返回非焦点视图

时间:2015-01-06 03:45:27

标签: visual-studio-2012 vsix vsx vspackage

我正在玩创建Visual Studio文本编辑命令。我创建了一个包,绑定命令,将其放入菜单中。但是,我不能以微软推荐的方式做的是弄清楚是否应该应用命令的活动文本视图。

我正在关注the VSSDK tutorial中的步骤(向下滚动到使用菜单命令添加评论装饰)。从菜单中选择命令后,可以调用mt命令处理程序。但是,当执行以下确切的教程代码时,我得到的结果是不一致的。

IVsTextManager txtMgr = (IVsTextManager)GetService(typeof(SVsTextManager));
IVsTextView vTextView = null;
int mustHaveFocus = 1;
txtMgr.GetActiveView(mustHaveFocus, null, out vTextView);

现在,如果只有文本视图,一切都按预期工作:返回活动文本视图。但是在图片中抛出另一个视图(我使用的是Bitmap编辑器),GetActiveView返回的视图似乎是最后一个活动文本视图。例如,如果我切换选项卡以将先前活动视图的位图视图调出到 fileA ,则会返回 fileA 的相同视图。换句话说,我无法弄清楚文本视图是否有焦点。

现在,这似乎与IVsTextManager::GetActiveView() documentation的{{3}}不一致。它必须说明函数的第一个参数:如果 true ,则返回当前的UI活动视图。我是否正确阅读?我观察到的行为似乎与另一种情况相对应:如果 false ,则返回最后一个活动视图,无论此视图当前是否处于UI活动状态。

我可以想出另一种将命令绑定到视图的方法,即通过挂钩视图创建。让我担心的是,我显然无法以微软推荐的方式处理命令。

3 个答案:

答案 0 :(得分:2)

VS编辑团队的开发人员使用不同方法的答案可能适用于提出原始问题的人,但对于我们想要使用GetActiveView的其他原因,问题仍然存在:如何只获取文本窗口有焦点而不是最后一个有焦点的文本窗口?不可靠的文档(建议mustHaveFocus是一个布尔值,即使它是一个int)似乎是误导,因为将值设置为0或1(或-1)似乎导致最后一个文本窗口焦点为回。

答案 1 :(得分:1)

嗯,抱歉这个令人困惑的文档,但是这个演练不是我建议你的案例(我是VS编辑团队的开发者)。

正如您所指出的,通过IVsTextViewCreationListener连接命令过滤器可以更简单地处理命令,这实际上是更常见和更好的方式,请参阅Walkthrough: Using a Shortcut Key with an Editor Extension(这也是一种令人困惑的标题:()

答案 2 :(得分:1)

如果GetActiveView(fMustHaveFocus, pBuffer, out ppView)fMustHaveFocus

pBuffer显然会忽略null。如果不是null,则表明其工作正常。

因此,您可以通过第一次使用第一次返回的视图缓冲区调用GetActiveView来获取active-and-must-focus-focus视图。

IVsTextView vsTextView;
IVsTextLines vsTextLines;
// `GetActiveView` apparently ignores `fMustHaveFocus` if `pBuffer` is null, so call
// it a second time with the buffer from the view it returned the first time to find
// out if the view actually has focus.
if (textManager.GetActiveView(1, null, out vsTextView) == VSConstants.S_OK &&
    vsTextView.GetBuffer(out vsTextLines) == VSConstants.S_OK &&
    textManager.GetActiveView(1, vsTextLines, out vsTextView) == VSConstants.S_OK)
{
    // vsTextView has focus.
}