Похоже, вы ищете хороший пример / справку о том, как выполнять обработку клавиатуры для вставки текста в буфер Visual Studio.
К сожалению, это не тот вопрос, на который есть прямой ответ. Работа с клавиатурой в Visual Studio в лучшем случае сложна, а время от времени тянет за волосы. Я постарался сделать этот ответ максимально простым, но, к сожалению, тема не поддается простоте
Для начала существует как минимум 5 различных механизмов, с помощью которых Visual Studio направляет ввод с клавиатуры в команды.
Какой из них вам нужно подключить, зависит от нескольких факторов
- В каких версиях Visual Studio надстройка должна работать?
- Какой тип надстройки вы будете собирать: реальный Addin, Vs Package или VSIX
- Как глубоко вы заботитесь о победе в битве за ввод с клавиатуры
То, что вам нужно подключить, во многом зависит от того, как вы хотите, чтобы ваш плагин работал, и в каких версиях Visual Studio вы хотите, чтобы он работал. Хотя есть 2 основных маршрута, которые вы можете выбрать, хотя
Первый - это разработка пакета Visual Studio и регистрация DTE.Command
для каждой горячей клавиши в вашем расширении. Затем вам нужно добавить IOleCommandTarget
в цепочку фильтров IVsTextView
s для обработки ваших команд. Такой подход позволит вам обрабатывать ваши горячие клавиши в большинстве сценариев.
Второй - разработать VSIX, подключиться к цепочке IOleCommandTarget
IVsTextView
и перехватить реальные команды Visual Studio, которые отображаются на ваши горячие клавиши.
У обоих этих подходов есть свои взлеты и падения, но мой ответ уже слишком длинный. Если вы можете дать мне более подробную информацию, я постараюсь дать вам более краткий и полезный ответ.
Что касается примеров. VsVim выполняет довольно обширную обработку клавиатуры для Visual Studio и имеет пример для любого из перечисленных выше методов.
Дайте мне знать, какой из них вас интересует, и я могу указать вам правильное место в исходном коде.
Кроме того, работая над выяснением путаницы ввода с клавиатуры, я пытался сохранить запись всего, что я выучил. Это не полностью обновлено, но этот документ описывает более основные аспекты того, как входные данные маршрутизируются
EDIT
Джон указал в комментариях VSIX + IOleCommandTarget
route
Это ИМХО самый простой подход. Однако следует помнить, что привязки команд влияют на данные, которые передаются по цепочке IOleCommandTarget
. Привязка команд Visual Studio происходит до того, как данные передаются в цепочку IOleCommandTarget
. Поэтому, если заданный клавишный ввод связан с командой, он будет передан IOleCommandTarget
как команда, а не клавиатурный ввод.
Например, CTRL-Z
обычно сопоставляется команде Visual Studio Undo
. Если пользователь нажмет CTRL-Z
, то IOleCommandTarget
увидит команду Отменить, а не ввод с клавиатуры CTRL-Z
.
Вот несколько примеров, которые могут вас заинтересовать
- VsCommandTarget : пример реализации
IOleCommandTarget
- OleCommandUtil : используется для преобразования данных, передаваемых в
IOleCommandTarget
, в фактические команды и ввод с клавиатуры
- HostFactory : подробно рассказывается, как на самом деле подключить
IOleCommandTarget
к IVsTextView
из расширения VSIX.