Я хочу перехватить ключевые события в сравнении с тем, что я искал много статей для справки, и this article вдохновил меня. Что я сделал:Проблемы после добавления командного фильтра в textview
создать новый класс и реализовать интерфейс «IVsTextManagerEvents» для регистрации каждого текстового поля.
public void OnRegisterView(IVsTextView pView) { CommandFilter filter = new CommandFilter(); IOleCommandTarget nextCommandTarget; pView.AddCommandFilter(filter, out nextCommandTarget); filter.NextCommandTarget = nextCommandTarget; }
добавить новый класс "CommandFilter", которые реализуют IOleCommandTarget, в котором мы можем перехватывать 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; } }
нам нужно посоветовать IVsTextManagerEvents в Initialize
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); }
после вышеподготовьте, теперь мы можем перехватить ключевые события. вы можете увидеть окно сообщения после нажатия клавиши «enter».
Мой вопрос, после того, как я сделал выше
- Я не могу сохранить документ, это означает, что, когда я гладил Ctrl + S, ничего не произошло.
- Вы можете видеть очевидную задержку, когда я говорю словами. Кажется, мой пакет занимает много времени, чтобы что-то обработать, но, как вы можете видеть выше, я совсем ничего не делал.
Смотрите мой ответ на ваш пост на форумах MSDN. http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/46b211d6-5405-40ff-99a7-360f6e1f16ef –