私はキーイベントを傍受したいのですが、私は多くの記事を検索してヘルプを探しました。this articleが私に影響を与えました。私が行っていることである。テキストビューにコマンドフィルタを追加した後の問題
は、新しいクラスを作成し、すべてのTextViewを登録する「IVsTextManagerEvents」インタフェースを実装しています。
public void OnRegisterView(IVsTextView pView) { CommandFilter filter = new CommandFilter(); IOleCommandTarget nextCommandTarget; pView.AddCommandFilter(filter, out nextCommandTarget); filter.NextCommandTarget = nextCommandTarget; }
我々は
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); }
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"の後にメッセージボックスが表示されます。私は、ドキュメントを保存することはできません
- の上に行ってきた後
私の質問は、私は、Ctrl + Sを撫でたときに、それが意味する、何も起こりませんでした。
- 私は単語をキー入力すると、明らかな遅延を見ることができます。私のパッケージは何かを処理するのに長い時間がかかるようですが、上記のように、私は全くしませんでした。
は、MSDNフォーラム上のあなたのポストに私の応答を参照してください。 http://social.msdn.microsoft.com/Forums/en-US/vsx/thread/46b211d6-5405-40ff-99a7-360f6e1f16ef –