Управление получением горячих клавиш, таких как вкладка и пробел.
-
03-07-2019 - |
Вопрос
У меня есть диалоговое окно, которое позволяет пользователям устанавливать горячие клавиши для использования в 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);
Используя этот подход, каждое нажатие клавиши будет отправляться на перехватчик, при условии, что элемент управления редактирования имеет фокус.