Я бы хотел, чтобы Scintilla игнорировала некоторые комбинации клавиш, такие как Ctrl + Enter или Ctrl + D, и чтобы уведомить родительское окно, когда они введены. Я прочитал документацию и не мог понять, как это сделать. Это возможно?Можно ли сообщить Scintilla игнорировать некоторые нажатия клавиш и передать их в родительское окно?
Можно ли сообщить Scintilla игнорировать некоторые нажатия клавиш и передать их в родительское окно?
ответ
На самом деле есть два варианта. Присоединение к WM_KEYDOWN
, как и было предложено, является одним. Другая - использовать таблицу ускорителей (см. http://msdn.microsoft.com/en-us/library/ms645526(VS.85).aspx) для перевода нажатий клавиш в идентификаторы команд более высокого уровня и обработки идентификаторов команд в вашем обработчике WM_COMMAND
.
Использование таблицы ускорителей, несомненно, является «правильным», но WM_KEYDOWN
, похоже, работает так же хорошо, и не требует изменения кода цикла сообщений/отслеживания функции магической структуры, которая должна быть переопределена/etc.
(При использовании MFC, волшебное рамочного функцию окна конкретных таблиц акселератора CWnd::PreTranslateMessage
. Override его, вызовите TranslateAccelerator
там (переходящий в таблице ускорителя, который загружается в конструкторе/OnCreate
/и др.) И вернуть FALSE
- если TranslateAccelerator
возвращается 0 - или TRUE
- если он возвращается что-то другое Это позволяет использовать сочетания клавиш, которые являются специфическими для SCINTILLA окон)
Кстати, обе эти методы сосуществуют вполне счастливо, поэтому некоторые из них.. нажатия клавиш можно обрабатывать с помощью ускорителей, а некоторые - с WM_KEYDOWN
. Моя последняя программа Scintilla сделала это; Я совершенно не могу вспомнить, почему, боюсь, но это, безусловно, сработало.
Если вы используете диалоги (то есть с DialogBoxParam), я настоятельно рекомендую использовать метод перехвата вместо ускорителей, потому что сложнее вводить ускоритель в насос сообщений, чем подключать окно. –
Ну, если все остальное не удается, вы можете подклассифицировать процедуру окна управления Scintilla. Было бы довольно просто перехватить сообщения WM_KEYDOWN и WM_KEYUP, отфильтровать их, а затем передать их либо в главный прогон окна Scintilla, либо в родительское окно.
Я быстро протестировал этот подход, используя информацию, которую я нашел в следующей статье: http://www.aaronballman.com/programming/REALbasic/WindowSubclassingArticle.php. Кажется, он работает нормально. Я проголосовал за вас, и если вы не получите более подробный ответ Синтиллы через пару дней, я соглашусь с этим. Благодарю. –
Да, я не мог найти ничего хорошего в документации. Удачи. – ChrisV
В LIVEditor я перехватываю ключевые события, прежде чем они попадут в редактор. –