2011-12-17 3 views
2

Я хочу перехватить ключевые события в сравнении с тем, что я искал много статей для справки, и this article вдохновил меня. Что я сделал:Проблемы после добавления командного фильтра в textview

  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 от против

    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); 
    } 
    

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

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

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

Смотрите мой ответ на ваш пост на форумах MSDN. http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/46b211d6-5405-40ff-99a7-360f6e1f16ef –

ответ

2

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

Не:

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

return VSConstants.S_OK; 

Но:

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

Спасибо, что нашли время, чтобы опубликовать решение! – RichieHindle