Я хочу перехватить ключевые события в сравнении с другими. Я искал много статей о помощи, и эта статья вдохновила меня. То, что я сделал, это:
создать новый класс и реализовать интерфейс "IVsTextManagerEvents" для регистрации каждого текстового представления.
public void OnRegisterView(IVsTextView pView)
{
CommandFilter filter = new CommandFilter();
IOleCommandTarget nextCommandTarget;
pView.AddCommandFilter(filter, out nextCommandTarget);
filter.NextCommandTarget = nextCommandTarget;
}
добавить новый класс "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;
}
}
мы должны сообщить 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);
}
после вышеописанной подготовки, теперь мы можем перехватывать ключевые события. Вы можете увидеть окно сообщения после нажатия клавиши «Ввод».
Мой вопрос после того, как я сделал выше
- Я не могу сохранить документ, это означает, что когда я нажал Ctrl + S, ничего не произошло.
- Вы можете видеть очевидную задержку, когда я набираю слова. Кажется, моя посылка заняла много времени, но, как вы можете видеть выше, я этого не сделал.