
Как использовать в своей программе "горячие клавиши"
Опубликовано: 28.10.2004
Исправлено: 10.12.2016
Q. Обьясните, пожалуйста, как использовать в своей программе "горячие клавиши"? Какой обработчик вызывать и что вписывать в карту сообщений?
A. Например, так:
1. Вставляем в диалог настройки элемент управления CHotKeyCtrl. Назначаем переменную для него и для числового значения горячей клавиши:
CHotKeyCtrl m_NewHKCtrl;
DWORD m_dwNewHK; |
2. При запуске диалога инициализируем CHotKeyCtrl значением по умолчанию:
m_dwNewHK=...
m_NewHKCtrl.SetHotKey(LOBYTE(LOWORD(m_dwNewHK)), HIBYTE(LOWORD(m_dwNewHK)));
|
3. Перед завершением диалога настройки считываем и сохраняем новую комбинацию клавиш:
m_dwNewHK = m_NewHKCtrl.GetHotKey();
|
4. Регистрируем горячую клавишу:
UINT TransModifiers(WORD wMod);
#define NEWHOTKEYID 1
hWnd = GetSafeHwnd();
RegisterHotKey(hWnd, NEWHOTKEYID,
TransModifiers(HIBYTE(LOWORD(m_dwNewHK))),
LOBYTE(LOWORD(m_dwNewHK)));
|
где:
UINT TransModifiers(WORD wMod)
{
UINT uMod = 0;
if (wMod & HOTKEYF_ALT)
uMod |= MOD_ALT;
if (wMod & HOTKEYF_SHIFT)
uMod |= MOD_SHIFT;
if (wMod & HOTKEYF_CONTROL)
uMod |= MOD_CONTROL;
return uMod;
}
|
5. В классе окна, на hWnd которого зарегистрирована наша горячая клавиша, добавляем обработчик:
BEGIN_MESSAGE_MAP(Cxxxxx, Cxxxxxx)
ON_MESSAGE(WM_HOTKEY, OnHotKey)
ON_WM_ACTIVATEAPP()
END_MESSAGE_MAP()
LONG Cxxxxxx::OnHotKey(UINT nID, LPARAM lParam)
{
switch (nID)
{
case NEWHOTKEYID :
break;
default:
break;
}
return 0;
}
|
6. Иногда нужно, чтобы горячие клавиши обрабатывались только когда пользователь работает с программой, в этом случае можно поставить обработчик на WM_ACTIVATEAPP:
void Cxxxxxxx:OnActivateApp(BOOL bActive, HTASK hTask)
{
if (bActive)
{
RegisterHotKey(hWnd, NEWHOTKEYID,
TransModifiers(HIBYTE(LOWORD(m_dwNewHK))),
LOBYTE(LOWORD(m_dwNewHK)));
}
else
{
UnregisterHotKey(hWnd, NEWHOTKEYID);
}
}
|
7. При завершении программы разрегистрируем горячие клавиши:
UnregisterHotKey(hWnd, NEWHOTKEYID);
|
Эта статья опубликована в журнале
RSDN Magazine
#4-2004. Информацию о журнале можно найти здесь