@@ -15,20 +15,23 @@ namespace Flow.Launcher.Infrastructure.Hotkey
15
15
/// </summary>
16
16
public unsafe class GlobalHotkey : IDisposable
17
17
{
18
+ private static readonly HOOKPROC _procKeyboard = HookKeyboardCallback ;
18
19
private static readonly UnhookWindowsHookExSafeHandle hookId ;
19
20
20
- public delegate bool KeyboardCallback ( int keyEvent , int vkCode , SpecialKeyState state ) ;
21
+ public delegate bool KeyboardCallback ( KeyEvent keyEvent , int vkCode , SpecialKeyState state ) ;
21
22
internal static Func < KeyEvent , int , SpecialKeyState , bool > hookedKeyboardCallback ;
22
23
23
24
static GlobalHotkey ( )
24
25
{
25
26
// Set the hook
26
- using Process curProcess = Process . GetCurrentProcess ( ) ;
27
- using ProcessModule curModule = curProcess . MainModule ;
28
- hookId = PInvoke . SetWindowsHookEx (
29
- WINDOWS_HOOK_ID . WH_KEYBOARD_LL ,
30
- LowLevelKeyboardProc ,
31
- PInvoke . GetModuleHandle ( curModule . ModuleName ) , 0 ) ;
27
+ hookId = SetHook ( _procKeyboard , WINDOWS_HOOK_ID . WH_KEYBOARD_LL ) ;
28
+ }
29
+
30
+ private static UnhookWindowsHookExSafeHandle SetHook ( HOOKPROC proc , WINDOWS_HOOK_ID hookId )
31
+ {
32
+ using var curProcess = Process . GetCurrentProcess ( ) ;
33
+ using var curModule = curProcess . MainModule ;
34
+ return PInvoke . SetWindowsHookEx ( hookId , proc , PInvoke . GetModuleHandle ( curModule . ModuleName ) , 0 ) ;
32
35
}
33
36
34
37
public static SpecialKeyState CheckModifiers ( )
@@ -58,28 +61,28 @@ public static SpecialKeyState CheckModifiers()
58
61
return state ;
59
62
}
60
63
61
- private static LRESULT LowLevelKeyboardProc ( int nCode , WPARAM wParam , LPARAM lParam )
64
+ private static LRESULT HookKeyboardCallback ( int nCode , WPARAM wParam , LPARAM lParam )
62
65
{
63
66
bool continues = true ;
64
67
65
68
if ( nCode >= 0 )
66
69
{
67
- var wParamValue = ( int ) wParam . Value ;
68
- if ( wParamValue == ( int ) KeyEvent . WM_KEYDOWN ||
69
- wParamValue == ( int ) KeyEvent . WM_KEYUP ||
70
- wParamValue == ( int ) KeyEvent . WM_SYSKEYDOWN ||
71
- wParamValue == ( int ) KeyEvent . WM_SYSKEYUP )
70
+ if ( wParam . Value == ( int ) KeyEvent . WM_KEYDOWN ||
71
+ wParam . Value == ( int ) KeyEvent . WM_KEYUP ||
72
+ wParam . Value == ( int ) KeyEvent . WM_SYSKEYDOWN ||
73
+ wParam . Value == ( int ) KeyEvent . WM_SYSKEYUP )
72
74
{
73
75
if ( hookedKeyboardCallback != null )
74
- continues = hookedKeyboardCallback ( ( KeyEvent ) wParamValue , Marshal . ReadInt32 ( lParam ) , CheckModifiers ( ) ) ;
76
+ continues = hookedKeyboardCallback ( ( KeyEvent ) wParam . Value , Marshal . ReadInt32 ( lParam ) , CheckModifiers ( ) ) ;
75
77
}
76
78
}
77
79
78
80
if ( continues )
79
81
{
80
82
return PInvoke . CallNextHookEx ( hookId , nCode , wParam , lParam ) ;
81
83
}
82
- return new LRESULT ( - 1 ) ;
84
+
85
+ return new LRESULT ( 1 ) ;
83
86
}
84
87
85
88
public void Dispose ( )
0 commit comments