Сообщений 2    Оценка 0        Оценить  
Система Orphus

Как использовать в своей программе "горячие клавиши"

Автор: Алексей Кирюшкин
Источник: RSDN Magazine #4-2004
Опубликовано: 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. Информацию о журнале можно найти здесь
    Сообщений 2    Оценка 0        Оценить