Клавиатура Raw Input с RIDEV_NOHOTKEYS отображает классическое меню Alt + Tab - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь отключить клавиши Windows для окна, которое использует RawInput для обработки событий клавиатуры. Обычный способ сделать это - установить низкоуровневый хук клавиатуры и отфильтровать там события клавиш Windows. Чтобы он работал с RawInput, мне нужно инициализировать устройство клавиатуры с помощью RIDEV_NOHOTKEYS. Однако, когда я делаю это, если я затем нажимаю Alt + Tab из приложения, по какой-то причине Windows 10 отображает классическую вещь Alt + Tab:

alt-tab menu

Я не отфильтровываю события Alt или Tab в низкоуровневом хуке клавиатуры, и это также происходит, если я вообще не устанавливаю низкоуровневый хук клавиатуры, просто это делает инициализация устройства клавиатуры с помощью RIDEV_NOHOTKEYS. Я попытался вернуть 0 для сообщений WM_INPUT, и я попытался вызвать стандартный оконный процесс, кажется, ничего не помогает ... У кого-нибудь была эта проблема раньше?

1 Ответ

1 голос
/ 15 марта 2019

Добавление низкоуровневой перехватчика ( WH_KEYBOARD_LL ) может помешать передаче сообщения Alt key другим окнам.См. « Функция обратного вызова LowLevelKeyboardProc ».

Хук WH_KEYBOARD_LL может быть установлен только при глобальной области действия .

// Register hook
hinstDLL = LoadLibrary(TEXT("sysmsg.dll"));
hkprcSysMsg = (SYSMESSAGEPROC)GetProcAddress(hinstDLL, "SysMessageProc");

HHOOK hook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)hkprcSysMsg, hinstDLL, 0);

Функция обратного вызова хука в DLL:

__declspec(dllexport)
LRESULT __cdecl SysMessageProc(int nCode, WPARAM wParam, LPARAM lParam)
{

    if (nCode < 0)  // do not process message 
        return CallNextHookEx(NULL, nCode,
            wParam, lParam);

    if (wParam == WM_SYSKEYDOWN)
    {
        if(((tagKBDLLHOOKSTRUCT*)lParam)->vkCode == VK_LMENU || ((tagKBDLLHOOKSTRUCT*)lParam)->vkCode == VK_RMENU)
        return 1;
    }


    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

Дополнительная справка: " Использование хуков " " Ввод с клавиатуры " " WM_SYSKEYDOWN message " " Структура KBDLLHOOKSTRUCT"" Коды виртуальных клавиш"

Примечание

Крючки, как правило, замедляют работу системы, поскольку увеличивают количествоОбработку система должна выполнить для каждого сообщения.Вы должны устанавливать хук только тогда, когда это необходимо, и удалять его как можно скорее.

Вы должны использовать глобальные хуки только для целей отладки;в противном случае вы должны избегать их.Глобальные хуки ухудшают производительность системы и вызывают конфликты с другими приложениями, которые реализуют тот же тип глобальных хуков.

...