Switch back to only one hook (it turns out the second hook was neither needed nor working) and filter keyboard input properly, fixes #5084.

This commit is contained in:
OBattler
2025-01-02 02:09:15 +01:00
parent 0f61db03ef
commit 3b79448286

View File

@@ -163,7 +163,6 @@ kbd_handle(uint16_t scancode, uint16_t flags)
We use scan code 0xFFFF to mean a mapping that We use scan code 0xFFFF to mean a mapping that
has a prefix other than E0 and that is not E1 1D, has a prefix other than E0 and that is not E1 1D,
which is, for our purposes, invalid. */ which is, for our purposes, invalid. */
/* Translate right CTRL to left ALT if the user has so /* Translate right CTRL to left ALT if the user has so
chosen. */ chosen. */
if ((scancode == 0x11d) && rctrl_is_lalt) if ((scancode == 0x11d) && rctrl_is_lalt)
@@ -173,18 +172,8 @@ kbd_handle(uint16_t scancode, uint16_t flags)
it's not an invalid scan code. */ it's not an invalid scan code. */
if (scancode != 0xFFFF) if (scancode != 0xFFFF)
keyboard_input(!(flags & LLKHF_UP), scancode); keyboard_input(!(flags & LLKHF_UP), scancode);
}
static LRESULT CALLBACK
input_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
LPKBDLLHOOKSTRUCT lpKdhs = (LPKBDLLHOOKSTRUCT) lParam;
kbd_handle(lpKdhs->scanCode & 0x00ff, lpKdhs->flags);
main_window->checkFullscreenHotkey(); main_window->checkFullscreenHotkey();
return CallNextHookEx(NULL, nCode, wParam, lParam);
} }
static LRESULT CALLBACK static LRESULT CALLBACK
@@ -194,44 +183,38 @@ emu_LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
/* Checks if CTRL was pressed. */ /* Checks if CTRL was pressed. */
BOOL bCtrlDown = GetAsyncKeyState (VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1); BOOL bCtrlDown = GetAsyncKeyState (VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1);
if ((GetForegroundWindow() == ((HWND) main_window->winId())) && !(lpKdhs->scanCode & 0xff00))
kbd_handle(lpKdhs->scanCode, lpKdhs->flags);
if ((nCode < 0) || (nCode != HC_ACTION) || (!mouse_capture && !video_fullscreen)) if ((nCode < 0) || (nCode != HC_ACTION) || (!mouse_capture && !video_fullscreen))
return CallNextHookEx(NULL, nCode, wParam, lParam); return CallNextHookEx(NULL, nCode, wParam, lParam);
else if ((lpKdhs->scanCode == 0x01) && (lpKdhs->flags & LLKHF_ALTDOWN) && else if ((lpKdhs->scanCode == 0x01) && (lpKdhs->flags & LLKHF_ALTDOWN) &&
!(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED))) { !(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED)))
kbd_handle(lpKdhs->scanCode & 0x00ff, lpKdhs->flags);
return TRUE; return TRUE;
} else if ((lpKdhs->scanCode == 0x01) && bCtrlDown && !(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED))) { else if ((lpKdhs->scanCode == 0x01) && bCtrlDown && !(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED)))
kbd_handle(lpKdhs->scanCode & 0x00ff, lpKdhs->flags);
return TRUE; return TRUE;
} else if ((lpKdhs->scanCode == 0x0f) && (lpKdhs->flags & LLKHF_ALTDOWN) && else if ((lpKdhs->scanCode == 0x0f) && (lpKdhs->flags & LLKHF_ALTDOWN) &&
!(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED))) { !(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED)))
kbd_handle(lpKdhs->scanCode & 0x00ff, lpKdhs->flags);
return TRUE; return TRUE;
} else if ((lpKdhs->scanCode == 0x0f) && bCtrlDown && !(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED))) { else if ((lpKdhs->scanCode == 0x0f) && bCtrlDown && !(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED)))
kbd_handle(lpKdhs->scanCode & 0x00ff, lpKdhs->flags);
return TRUE; return TRUE;
} else if ((lpKdhs->scanCode == 0x39) && (lpKdhs->flags & LLKHF_ALTDOWN) && else if ((lpKdhs->scanCode == 0x39) && (lpKdhs->flags & LLKHF_ALTDOWN) &&
!(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED))) { !(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED)))
kbd_handle(lpKdhs->scanCode & 0x00ff, lpKdhs->flags);
return TRUE; return TRUE;
} else if ((lpKdhs->scanCode == 0x3e) && (lpKdhs->flags & LLKHF_ALTDOWN) && else if ((lpKdhs->scanCode == 0x3e) && (lpKdhs->flags & LLKHF_ALTDOWN) &&
!(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED))) { !(lpKdhs->flags & (LLKHF_UP | LLKHF_EXTENDED)))
kbd_handle(lpKdhs->scanCode & 0x00ff, lpKdhs->flags);
return TRUE; return TRUE;
} else if ((lpKdhs->scanCode == 0x49) && bCtrlDown && !(lpKdhs->flags & LLKHF_UP)) { else if ((lpKdhs->scanCode == 0x49) && bCtrlDown && !(lpKdhs->flags & LLKHF_UP))
kbd_handle(lpKdhs->scanCode & 0x00ff, lpKdhs->flags);
return TRUE; return TRUE;
} else if ((lpKdhs->scanCode >= 0x5b) && (lpKdhs->scanCode <= 0x5d) && (lpKdhs->flags & LLKHF_EXTENDED)) { else if ((lpKdhs->scanCode >= 0x5b) && (lpKdhs->scanCode <= 0x5d) && (lpKdhs->flags & LLKHF_EXTENDED))
kbd_handle(lpKdhs->scanCode & 0x00ff, lpKdhs->flags);
return TRUE; return TRUE;
} else else
return CallNextHookEx(NULL, nCode, wParam, lParam); return CallNextHookEx(NULL, nCode, wParam, lParam);
} }
#endif #endif
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
static HHOOK llhook = NULL; static HHOOK llhook = NULL;
static HHOOK llihook = NULL;
#endif #endif
void void
@@ -494,11 +477,16 @@ main(int argc, char *argv[])
}); });
} }
/* Force raw input if a debugger is present. */
if (IsDebuggerPresent()) {
pclog("WARNING: Debugged detected, forcing raw input\n");
raw_input = 1;
}
/* Setup raw input */ /* Setup raw input */
auto rawInputFilter = WindowsRawInputFilter::Register(main_window); auto rawInputFilter = WindowsRawInputFilter::Register(main_window);
if (rawInputFilter) { if (rawInputFilter) {
app.installNativeEventFilter(rawInputFilter.get()); app.installNativeEventFilter(rawInputFilter.get());
if (raw_input)
main_window->setSendKeyboardInput(false); main_window->setSendKeyboardInput(false);
} }
#endif #endif
@@ -561,10 +549,7 @@ main(int argc, char *argv[])
#ifdef Q_OS_WINDOWS #ifdef Q_OS_WINDOWS
if (!raw_input) { if (!raw_input) {
llhook = SetWindowsHookEx(WH_KEYBOARD_LL, emu_LowLevelKeyboardProc, NULL, 0); llhook = SetWindowsHookEx(WH_KEYBOARD_LL, emu_LowLevelKeyboardProc, NULL, 0);
llihook = SetWindowsHookEx(WH_KEYBOARD_LL, input_LowLevelKeyboardProc, NULL, GetCurrentThreadId());
atexit([] () -> void { atexit([] () -> void {
if (llihook)
UnhookWindowsHookEx(llihook);
if (llhook) if (llhook)
UnhookWindowsHookEx(llhook); UnhookWindowsHookEx(llhook);
}); });