[INDICDLL] Don't use WH_KEYBOARD_LL but WH_KEYBOARD (#8142)

- Replace WH_KEYBOARD_LL hook and
  handler with WH_KEYBOARD and
  adapted KeyboardProc.
- Update key-state checks to use
  HIWORD(lParam) flags and
  GetKeyState.
This commit is contained in:
Katayama Hirofumi MZ 2025-06-17 18:44:15 +09:00 committed by GitHub
parent e26ad0de12
commit 13e7f56754
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -14,7 +14,7 @@ typedef struct tagSHARED_DATA
{ {
HHOOK hWinHook; HHOOK hWinHook;
HHOOK hShellHook; HHOOK hShellHook;
HHOOK hKeyboardLLHook; HHOOK hKeyboardHook;
HWND hKbSwitchWnd; HWND hKbSwitchWnd;
UINT nHotID; UINT nHotID;
DWORD_PTR dwHotMenuItemData; DWORD_PTR dwHotMenuItemData;
@ -77,38 +77,38 @@ ShellHookProc(INT code, WPARAM wParam, LPARAM lParam)
} }
static inline BOOL static inline BOOL
CheckVirtualKey(UINT vKey, UINT vKey1, UINT vKey2) CheckVirtualKey(UINT vKey, UINT vKey0, UINT vKey1, UINT vKey2)
{ {
return vKey == vKey1 || vKey == vKey2; return vKey == vKey0 || vKey == vKey1 || vKey == vKey2;
} }
static LRESULT CALLBACK static LRESULT CALLBACK
KeyboardLLHook(INT code, WPARAM wParam, LPARAM lParam) KeyboardProc(INT code, WPARAM wParam, LPARAM lParam)
{ {
if (code < 0) if (code < 0)
return CallNextHookEx(g_pShared->hKeyboardLLHook, code, wParam, lParam); return CallNextHookEx(g_pShared->hKeyboardHook, code, wParam, lParam);
if (code == HC_ACTION) if (code == HC_ACTION)
{ {
PKBDLLHOOKSTRUCT pKbStruct = (PKBDLLHOOKSTRUCT)lParam; UINT vKey = (UINT)wParam;
if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) LONG keyFlags = HIWORD(lParam);
if (!(keyFlags & KF_UP) && !(keyFlags & KF_REPEAT))
{ {
BOOL bShiftPressed = GetAsyncKeyState(VK_SHIFT) < 0; BOOL bShiftPressed = (GetKeyState(VK_SHIFT) < 0);
BOOL bAltPressed = GetAsyncKeyState(VK_MENU) < 0; BOOL bAltPressed = (keyFlags & KF_ALTDOWN) || (GetKeyState(VK_MENU) < 0);
BOOL bCtrlPressed = GetAsyncKeyState(VK_CONTROL) < 0; BOOL bCtrlPressed = (GetKeyState(VK_CONTROL) < 0);
// Detect Alt+Shift and Ctrl+Shift // Detect Alt+Shift and Ctrl+Shift
UINT vkCode = pKbStruct->vkCode; if ((bAltPressed && CheckVirtualKey(vKey, VK_SHIFT, VK_LSHIFT, VK_RSHIFT)) ||
if ((bAltPressed && CheckVirtualKey(vkCode, VK_LSHIFT, VK_RSHIFT)) || (bShiftPressed && CheckVirtualKey(vKey, VK_MENU, VK_LMENU, VK_RMENU)) ||
(bShiftPressed && CheckVirtualKey(vkCode, VK_LMENU, VK_RMENU)) || (bCtrlPressed && CheckVirtualKey(vKey, VK_SHIFT, VK_LSHIFT, VK_RSHIFT)) ||
(bCtrlPressed && CheckVirtualKey(vkCode, VK_LSHIFT, VK_RSHIFT)) || (bShiftPressed && CheckVirtualKey(vKey, VK_CONTROL, VK_LCONTROL, VK_RCONTROL)))
(bShiftPressed && CheckVirtualKey(vkCode, VK_LCONTROL, VK_RCONTROL)))
{ {
PostMessageToMainWnd(WM_LANG_CHANGED, 0, 0); PostMessageToMainWnd(WM_LANG_CHANGED, 0, 0);
} }
} }
} }
return CallNextHookEx(g_pShared->hKeyboardLLHook, code, wParam, lParam); return CallNextHookEx(g_pShared->hKeyboardHook, code, wParam, lParam);
} }
BOOL APIENTRY BOOL APIENTRY
@ -119,11 +119,11 @@ KbSwitchSetHooks(_In_ BOOL bDoHook)
{ {
g_pShared->hWinHook = SetWindowsHookEx(WH_CBT, WinHookProc, g_hInstance, 0); g_pShared->hWinHook = SetWindowsHookEx(WH_CBT, WinHookProc, g_hInstance, 0);
g_pShared->hShellHook = SetWindowsHookEx(WH_SHELL, ShellHookProc, g_hInstance, 0); g_pShared->hShellHook = SetWindowsHookEx(WH_SHELL, ShellHookProc, g_hInstance, 0);
g_pShared->hKeyboardLLHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardLLHook, g_hInstance, 0); g_pShared->hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInstance, 0);
if (g_pShared->hWinHook && if (g_pShared->hWinHook &&
g_pShared->hShellHook && g_pShared->hShellHook &&
g_pShared->hKeyboardLLHook) g_pShared->hKeyboardHook)
{ {
LeaveCriticalSection(&g_pShared->csLock); LeaveCriticalSection(&g_pShared->csLock);
return TRUE; return TRUE;
@ -131,10 +131,10 @@ KbSwitchSetHooks(_In_ BOOL bDoHook)
} }
/* Unhook */ /* Unhook */
if (g_pShared->hKeyboardLLHook) if (g_pShared->hKeyboardHook)
{ {
UnhookWindowsHookEx(g_pShared->hKeyboardLLHook); UnhookWindowsHookEx(g_pShared->hKeyboardHook);
g_pShared->hKeyboardLLHook = NULL; g_pShared->hKeyboardHook = NULL;
} }
if (g_pShared->hShellHook) if (g_pShared->hShellHook)
{ {