Я думаю, что все видели Winamp. Если нет, хех… Одной из особенностей Winamp-а является большое количество горячих клавиш. Эти клавиши вы можете нажимать в любой программе, т.е. они определены для всей системы. Вы можете задать свои комбинации клавиш для выполнения определенной функции. Одна из функций – Показать/Скрыть окно Winampa-а. Эта статья о том, как этого добиться.
Задачи
- «Дать» пользователю поле для занесения комбинации горячих клавиш. Естественно, в этом поле необходимо отображать какую комбинацию пользователь нажал.
- Необходимо зарегистрировать комбинацию.
- Определить в программе, что зарегистрированная комбинация клавиш нажата.
- Entry-поле для отображения комбинации нажатых клавиш
Можно по разному реализовать данную задачу. Можно отказаться от использования entry-поля, использовать, например, option или check box-ы в комбинации с выпадающим списком, но был выбран именно такой вариант – read only entry-поле, пользователь нажимает комбинацию клавиш и она отображается в этом поле.
Для того, чтобы отловить нажатие клавиш, необходимо засабклассить entry-поле. В сабкласс-процедуре отлавливаем событие WM_KEYDOWN. Функция GetKeyNameText возвращает текст (символ) нажатой клавиши. В один момент времени может быть нажата только одна клавиша. Т.е. не стоит ожидать, что функция вернет вам сразу комбинацию Ctrl+Shift+S: вначале Ctrl, потом Shift, следом S. Для того, чтобы узнать нажаты ли в данный момент другие клавиши (имеются ввиду стд набор клавиш Ctrl, Alt, Shift, WinKey) используется функция API GetKeyState.
Информация о нажатой клавише – это флаги нажатия Ctrl, Alt, Shift, WinKey и код «обычной» нажатой клавиши.
Собственно и все: поймали WM_KEYDOWN, определили комбинацию, собрали комбинацию воедино и отобразили в entry-поле.
В предоставленном ниже примере нет разницы между правой/левой WinKey-клавишей.
Регистрация горячих клавиш
Здесь еще проще. Используем API RegisterHotKey.
RegisterHotKey(ULONG hWnd,LONG id,ULONG fsModifiers,ULONG vk),BOOL,PASCAL
hWnd – хэндл окна, которое будет обрабатывать нажатие горячей клавиши
id – номер горячей клавиши
fsModifiers – флаг нажатия Ctrl, Alt, Shift и т.п.
vk – код «обычной» клавиши
насколько я понял, функция GetLastError возвращает две ошибки регистрации:
1. Горячая клавиша уже зарегистрирована (другим приложением или вашим повторно, помните, что горячие клавиши данного типа глобальны)
2. Не могу зарегистрировать глобальную клавишу (по непонятной причине)
По выходу (или по моменту, который вам необходим) нужно убрать регистрацию комбинации. Это обязательно, иначе другое приложение/или повторный запуск вашего не смогут использовать/обрабатывать данную комбинацию.
С регистрацией также все прозрачно – функция UnregisterHotKey.
Определение нажатия комбинации
При регистрации комбинации вы указываете окно, которое будет получать событие WM_HOTKEY. Соответственно, сабклассим данное окно и ловим событие.
Определяемся, какая комбинация была нажата и выполняем необходимое действие.
Действие скрытия/показа окна регулируется свойствами Prop:Active, Prop:Iconize для «обычных» окон.
Пример
Пример собран на C6.3 9050.
Для просмотра примера необходимо зарегистрировать шаблон dp_class.tpl – это небольшой шаблон для «красивого» написания классов. Все рекомендации.
Используется класс сабклассинга xCallbackClass (xCBClass.inc, xCBClass.clw). Если вы ранее скачивали данный класс, то обновите его, есть небольшие изменения. В проекте определены две глобальные переменные _XCBCLinkMode_, _XCBCDllMode_ для правильной линковки данного класса. Теперь класс можно использовать и в Legacy-шаблонах.
Классы hotkey-ев реализованы в количестве трех штук. Один абстрактный базовый класс, класс для отображения в entry-поле и класс регистрации комбинации. На вашу совесть оставляю написания класса для использования нескольких горячих клавиш.
Из классов можно почерпнуть немного информации о простом наследовании и полиморфизме.
…и можно писать свою shareware-программу типа HotKeyboardPro (http://www.imposant.com) или WinKey (http://www.copernic.com/winkey — саппорт программы прекращен, ищите в Google)
Скачать пример