Сообщений 2 Оценка 0 Оценить |
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); |
Сообщений 2 Оценка 0 Оценить |