Проблемы после добавления командного фильтра в текстовое представление - PullRequest
2 голосов
/ 17 декабря 2011

Я хочу перехватить ключевые события в сравнении с другими. Я искал много статей о помощи, и эта статья вдохновила меня. То, что я сделал, это:

  1. создать новый класс и реализовать интерфейс "IVsTextManagerEvents" для регистрации каждого текстового представления.

    public void OnRegisterView(IVsTextView pView)
    {
        CommandFilter filter = new CommandFilter();
        IOleCommandTarget nextCommandTarget;
        pView.AddCommandFilter(filter, out nextCommandTarget);
        filter.NextCommandTarget = nextCommandTarget;
    }
    
  2. добавить новый класс "CommandFilter", который реализует IOleCommandTarget, в котором мы можем перехватить команду olecommand из vs

    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. мы должны сообщить 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);
    }
    

после вышеописанной подготовки, теперь мы можем перехватывать ключевые события. Вы можете увидеть окно сообщения после нажатия клавиши «Ввод».

Мой вопрос после того, как я сделал выше

  1. Я не могу сохранить документ, это означает, что когда я нажал Ctrl + S, ничего не произошло.
  2. Вы можете видеть очевидную задержку, когда я набираю слова. Кажется, моя посылка заняла много времени, но, как вы можете видеть выше, я этого не сделал.

1 Ответ

2 голосов
/ 18 декабря 2011

Кажется, я нашел ответ!

Не:

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

return VSConstants.S_OK;

Но:

return NextCommandTarget.Exec(pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...