Добавление низкоуровневой перехватчика ( 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"" Коды виртуальных клавиш"
Примечание
Крючки, как правило, замедляют работу системы, поскольку увеличивают количествоОбработку система должна выполнить для каждого сообщения.Вы должны устанавливать хук только тогда, когда это необходимо, и удалять его как можно скорее.
Вы должны использовать глобальные хуки только для целей отладки;в противном случае вы должны избегать их.Глобальные хуки ухудшают производительность системы и вызывают конфликты с другими приложениями, которые реализуют тот же тип глобальных хуков.