问题后,我添加一个命令过滤器的textview
本文关键字:一个 命令 过滤器 textview 添加 问题 | 更新日期: 2023-09-27 18:18:03
我想截取vs中的关键事件。我搜索了许多文章寻求帮助,这篇文章启发了我。我所做的是:
-
创建一个新的类并实现"IVsTextManagerEvents"接口来注册每个textview
public void OnRegisterView(IVsTextView pView) { CommandFilter filter = new CommandFilter(); IOleCommandTarget nextCommandTarget; pView.AddCommandFilter(filter, out nextCommandTarget); filter.NextCommandTarget = nextCommandTarget; }
-
添加新的类"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; } }
-
我们需要在Initialize
中通知IVsTextManagerEventsprotected 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); }
我的问题是,在我做了以上这些之后
- 我不能保存文档,这意味着当我按ctrl+S时,什么也没发生。
- 当我输入单词时,你可以看到明显的延迟。似乎我的包需要很长时间来处理一些事情,但正如你上面看到的,我根本没有。
看来我找到答案了!
:
NextCommandTarget.Exec(pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut);
return VSConstants.S_OK;
但:
return NextCommandTarget.Exec(pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut);