问题后,我添加一个命令过滤器的textview

本文关键字:一个 命令 过滤器 textview 添加 问题 | 更新日期: 2023-09-27 18:18:03

我想截取vs中的关键事件。我搜索了许多文章寻求帮助,这篇文章启发了我。我所做的是:

  1. 创建一个新的类并实现"IVsTextManagerEvents"接口来注册每个textview

    public void OnRegisterView(IVsTextView pView)
    {
        CommandFilter filter = new CommandFilter();
        IOleCommandTarget nextCommandTarget;
        pView.AddCommandFilter(filter, out nextCommandTarget);
        filter.NextCommandTarget = nextCommandTarget;
    }
    
  2. 添加新的类"CommandFilter"实现IOleCommandTarget,其中我们可以从vs中拦截olecommand命令

    public class CommandFilter : IOleCommandTarget
    {    
        public IOleCommandTarget NextCommandTarget
        {
            get; 
            set;
        }
        public int QueryStatus(ref Guid pguidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
        {
            NextCommandTarget.QueryStatus(ref pguidCmdGroup, cCmds, prgCmds, pCmdText);
            return VSConstants.S_OK;
        }
        public int Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
        {
            if (pguidCmdGroup == typeof(VSConstants.VSStd2KCmdID).GUID)
            {
                switch (nCmdID)
                {
                    case (uint)VSConstants.VSStd2KCmdID.RETURN:
                        MessageBox.Show("enter");
                        break;
                }
            }
            NextCommandTarget.Exec(pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut);
            return VSConstants.S_OK;
        }
    }
    
  3. 我们需要在Initialize

    中通知IVsTextManagerEvents
    protected override void Initialize()
    {
        base.Initialize();
        IConnectionPointContainer textManager = (IConnectionPointContainer)GetService(typeof(SVsTextManager));
        Guid interfaceGuid = typeof(IVsTextManagerEvents).GUID;
        textManager.FindConnectionPoint(ref interfaceGuid, out tmConnectionPoint);
        tmConnectionPoint.Advise(new TextManagerEventSink(), out tmConnectionCookie);
    }
    
在上面的准备之后,我们现在可以拦截键事件。按回车键后会出现一个消息框。

我的问题是,在我做了以上这些之后

  1. 我不能保存文档,这意味着当我按ctrl+S时,什么也没发生。
  2. 当我输入单词时,你可以看到明显的延迟。似乎我的包需要很长时间来处理一些事情,但正如你上面看到的,我根本没有。

问题后,我添加一个命令过滤器的textview

看来我找到答案了!

:

NextCommandTarget.Exec(pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut);
return VSConstants.S_OK;

但:

return NextCommandTarget.Exec(pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut);