2011-12-17 9 views
2

私はキーイベントを傍受したいのですが、私は多くの記事を検索してヘルプを探しました。this articleが私に影響を与えました。私が行っていることである。テキストビューにコマンドフィルタを追加した後の問題

  1. は、新しいクラスを作成し、すべてのTextViewを登録する「IVsTextManagerEvents」インタフェースを実装しています。

    public void OnRegisterView(IVsTextView pView) 
    { 
        CommandFilter filter = new CommandFilter(); 
        IOleCommandTarget nextCommandTarget; 
        pView.AddCommandFilter(filter, out nextCommandTarget); 
        filter.NextCommandTarget = nextCommandTarget; 
    } 
    
  2. 我々は

    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); 
    } 
    
初期にIVsTextManagerEventsに助言する必要が

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; 
    } 
} 
  • 対からolecommand傍受が可能なのIOleCommandTargetを実装する新しいクラス "CommandFilter" を追加上記のようにして

    を準備すれば、キーイベントを傍受することができます。ストロークキー "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

    関連する問題