Использование мультимедийной клавиатуры в Delphi-приложениях
Многие из нас пользуются мультимедийными или расширенными клавиатурами, где кроме обычных 100 с чем-то клавиш есть клавиши, упрощающие доступ к часто используемым функциям. Например, навигацию в браузере (Home, Back, Forward, Refresh, Stop), проигрывание музыки и фильмов в плеере, вызов калькулятора, почтового клиента и т.д.
Эти дополнительные клавиши действительно часто упрощают вызов постоянно используемых действий. Как же сделать поддержку этих клавиш в Delphi, чтобы пользователю было удобнее пользоваться нашей программой?
Все дело в том, что дополнительные клавиши не эмулируют нажатие той или иной комбинации, а имеют собственные коды:
| Название | Код | Вызываемое приложение (по-умолчанию) |
|---|---|---|
| Группа Internet | ||
| Back | 166 | |
| Forward | 167 | |
| Stop | 169 | |
| Favorites | 171 | |
| Search | 170 | Windows Search |
| Refresh | 168 | |
| Home | 172 | Internet Explorer или другой браузер по-умолчанию |
| 180 | Windows Mail или другой почтовый клиент по-умолчанию | |
| Audio | ||
| Mute | 173 | Включает/выключает звук в системе |
| -Vol | 174 | Уменьшает уровень звука в системе |
| +Vol | 175 | Увеличивает уровень звука в системе |
| Media | 181 | Windows Media Player |
| Stop | 178 | |
| Play/pause | 179 | |
| Next | 176 | |
| Prev | 177 | |
| Другие | ||
| Calculator | 183 | Калькулятор |
| My Computer | 182 | Мой компьютер |
Кроме того, как видно из таблицы, некоторые клавиши вызывают определенные программы или выполняют какие-то действия в системе, независимо от активного приложения. Видимо это происходит из-за того, что этим действиям назначены глобальные горячие клавиши, лично я этот вопрос не изучал.
Нажатия дополнительных клавиш можно перехватить в событии OnKeyDown формы или компонентов, параметр Key которого будет в этом случае содержать какой-то из приведенных в таблице кодов. Но что делать если все горячие клавиши приложения построены на специально предназначенном для этого механизме — Actions? Здесь не все так тривиально, так как мультимедийные клавиши не имеют названий и занести их в свойства TAction.Shortcut или TAction.SecondaryShortcuts не выйдет. Но это только в Object Inspector. На самом деле свойство SecondaryShortcuts представляет собой список особого вида: класс TShortCutList, наследник TStringList. В его свойстве Items хранятся названия горячих клавиш: те, которые вводятся в Object Inspector. А в свойстве Objects список «закодированных» в тип TShortCut горячих клавиш, соответствующих тем, что находятся в свойстве Items. Таким образом можно добавить дополнительные горячие клавиши к экшену программно:
(* Action1 будет реагировать на нажатие "интернетного" Next на мультимедийной клавиатуре *) Action1.SecondaryShortCuts.AddObject('', TObject(ShortCut(167, []))); (* Action2 будет реагировать на нажатие Back на мультимедийной клавиатуре *) Action2.SecondaryShortCuts.AddObject('', TObject(ShortCut(166, [])));
Добавив такой код в событие TForm.OnCreate, можно обеспечить поддержку мультимедийных горячих клавиш для любых действий.