Многие из нас пользуются мультимедийными или расширенными клавиатурами, где кроме обычных 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 или другой браузер по-умолчанию
Mail 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, можно обеспечить поддержку мультимедийных горячих клавиш для любых действий.