Fix key event return result issue

This commit is contained in:
Jack251970 2024-12-11 09:57:13 +08:00
parent ce8b42bc6e
commit dbe626d238

View file

@ -15,20 +15,23 @@ namespace Flow.Launcher.Infrastructure.Hotkey
/// </summary> /// </summary>
public unsafe class GlobalHotkey : IDisposable public unsafe class GlobalHotkey : IDisposable
{ {
private static readonly HOOKPROC _procKeyboard = HookKeyboardCallback;
private static readonly UnhookWindowsHookExSafeHandle hookId; private static readonly UnhookWindowsHookExSafeHandle hookId;
public delegate bool KeyboardCallback(int keyEvent, int vkCode, SpecialKeyState state); public delegate bool KeyboardCallback(KeyEvent keyEvent, int vkCode, SpecialKeyState state);
internal static Func<KeyEvent, int, SpecialKeyState, bool> hookedKeyboardCallback; internal static Func<KeyEvent, int, SpecialKeyState, bool> hookedKeyboardCallback;
static GlobalHotkey() static GlobalHotkey()
{ {
// Set the hook // Set the hook
using Process curProcess = Process.GetCurrentProcess(); hookId = SetHook(_procKeyboard, WINDOWS_HOOK_ID.WH_KEYBOARD_LL);
using ProcessModule curModule = curProcess.MainModule; }
hookId = PInvoke.SetWindowsHookEx(
WINDOWS_HOOK_ID.WH_KEYBOARD_LL, private static UnhookWindowsHookExSafeHandle SetHook(HOOKPROC proc, WINDOWS_HOOK_ID hookId)
LowLevelKeyboardProc, {
PInvoke.GetModuleHandle(curModule.ModuleName), 0); using var curProcess = Process.GetCurrentProcess();
using var curModule = curProcess.MainModule;
return PInvoke.SetWindowsHookEx(hookId, proc, PInvoke.GetModuleHandle(curModule.ModuleName), 0);
} }
public static SpecialKeyState CheckModifiers() public static SpecialKeyState CheckModifiers()
@ -58,20 +61,19 @@ namespace Flow.Launcher.Infrastructure.Hotkey
return state; return state;
} }
private static LRESULT LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) private static LRESULT HookKeyboardCallback(int nCode, WPARAM wParam, LPARAM lParam)
{ {
bool continues = true; bool continues = true;
if (nCode >= 0) if (nCode >= 0)
{ {
var wParamValue = (int)wParam.Value; if (wParam.Value == (int)KeyEvent.WM_KEYDOWN ||
if (wParamValue == (int)KeyEvent.WM_KEYDOWN || wParam.Value == (int)KeyEvent.WM_KEYUP ||
wParamValue == (int)KeyEvent.WM_KEYUP || wParam.Value == (int)KeyEvent.WM_SYSKEYDOWN ||
wParamValue == (int)KeyEvent.WM_SYSKEYDOWN || wParam.Value == (int)KeyEvent.WM_SYSKEYUP)
wParamValue == (int)KeyEvent.WM_SYSKEYUP)
{ {
if (hookedKeyboardCallback != null) if (hookedKeyboardCallback != null)
continues = hookedKeyboardCallback((KeyEvent)wParamValue, Marshal.ReadInt32(lParam), CheckModifiers()); continues = hookedKeyboardCallback((KeyEvent)wParam.Value, Marshal.ReadInt32(lParam), CheckModifiers());
} }
} }
@ -79,7 +81,8 @@ namespace Flow.Launcher.Infrastructure.Hotkey
{ {
return PInvoke.CallNextHookEx(hookId, nCode, wParam, lParam); return PInvoke.CallNextHookEx(hookId, nCode, wParam, lParam);
} }
return new LRESULT(-1);
return new LRESULT(1);
} }
public void Dispose() public void Dispose()