Управление получением горячих клавиш, таких как вкладка и пробел.

StackOverflow https://stackoverflow.com/questions/154547

Вопрос

У меня есть диалоговое окно, которое позволяет пользователям устанавливать горячие клавиши для использования в 3D-программе в Windows.Я использую CHotKeyCtrl, который довольно хорош, но не обрабатывает некоторые клавиши, которые хотели бы использовать пользователи, в частности, табуляцию и пробел.

Обработка горячих клавиш достаточно умна, чтобы можно было активировать эти клавиши, мне просто нужен пользовательский интерфейс, чтобы их можно было настроить.Элемент управления, аналогичный CHotKeyCtrl, был бы идеальным, но приветствуются и другие обходные пути.

Это было полезно?

Решение

Одним из вариантов обходного решения было бы использование стандартного элемента управления редактированием с функцией перехвата сообщений.

Это позволит вам захватить клавиатуру WM_KEYDOWN сообщения, отправленные в этот элемент управления редактированием.

Функция перехвата будет выглядеть примерно так:

    LRESULT CALLBACK MessageHook(int code, WPARAM wParam, LPMSG lpMsg)
    {
      LRESULT lResult = 0;

      if ((code >= 0) && (code == MSGF_DIALOGBOX))
      {
        if (lpMsg->message == WM_KEYDOWN)
        {
          //-- process the key down message
          lResult = 1;
        }
      }

      // do default processing if required
      if (lResult == 0)
      {
        lResult = CallNextHookEx(MessageFilterHook, code, wParam, (LPARAM)lpMsg);
      }

      return lResult;
    }

Затем хук можно прикрепить к элементу управления редактированием, когда элемент управления редактированием получит фокус следующим образом:

    //-- create an instance thunk for our hook callback
    FARPROC FilterProc = (FARPROC) MakeProcInstance((HOOKPROC)(MessageHook),
                                                    hInstance);
    //-- attach the message hook
    FilterHook = SetWindowsHookEx(WH_MSGFILTER, 
                                 (HOOKPROC)FilterProc, 
                                  hInstance, GetCurrentThreadId());

и удаляется, когда элемент управления редактированием теряет фокус следующим образом:

    //-- remove a message hook
    UnhookWindowsHookEx(MessageFilterHook);

Используя этот подход, каждое нажатие клавиши будет отправляться на перехватчик, при условии, что элемент управления редактирования имеет фокус.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top