@@ -9,41 +9,29 @@ namespace Flow.Launcher.Infrastructure.Hotkey
9
9
/// Listens keyboard globally.
10
10
/// <remarks>Uses WH_KEYBOARD_LL.</remarks>
11
11
/// </summary>
12
- public class GlobalHotkey : IDisposable
12
+ public unsafe static class GlobalHotkey
13
13
{
14
- private static GlobalHotkey instance ;
15
- private InterceptKeys . LowLevelKeyboardProc hookedLowLevelKeyboardProc ;
16
- private IntPtr hookId = IntPtr . Zero ;
14
+ private static readonly IntPtr hookId ;
15
+
16
+
17
+
17
18
public delegate bool KeyboardCallback ( KeyEvent keyEvent , int vkCode , SpecialKeyState state ) ;
18
- public event KeyboardCallback hookedKeyboardCallback ;
19
+ internal static Func < KeyEvent , int , SpecialKeyState , bool > hookedKeyboardCallback ;
19
20
20
21
//Modifier key constants
21
22
private const int VK_SHIFT = 0x10 ;
22
23
private const int VK_CONTROL = 0x11 ;
23
24
private const int VK_ALT = 0x12 ;
24
25
private const int VK_WIN = 91 ;
25
26
26
- public static GlobalHotkey Instance
27
+ static GlobalHotkey ( )
27
28
{
28
- get
29
- {
30
- if ( instance == null )
31
- {
32
- instance = new GlobalHotkey ( ) ;
33
- }
34
- return instance ;
35
- }
36
- }
37
-
38
- private GlobalHotkey ( )
39
- {
40
- // We have to store the LowLevelKeyboardProc, so that it is not garbage collected runtime
41
- hookedLowLevelKeyboardProc = LowLevelKeyboardProc ;
42
29
// Set the hook
43
- hookId = InterceptKeys . SetHook ( hookedLowLevelKeyboardProc ) ;
30
+ hookId = InterceptKeys . SetHook ( & LowLevelKeyboardProc ) ;
31
+ AppDomain . CurrentDomain . ProcessExit += ( _ , _ ) => Dispose ( ) ;
44
32
}
45
33
46
- public SpecialKeyState CheckModifiers ( )
34
+ public static SpecialKeyState CheckModifiers ( )
47
35
{
48
36
SpecialKeyState state = new SpecialKeyState ( ) ;
49
37
if ( ( InterceptKeys . GetKeyState ( VK_SHIFT ) & 0x8000 ) != 0 )
@@ -71,7 +59,7 @@ public SpecialKeyState CheckModifiers()
71
59
}
72
60
73
61
[ MethodImpl ( MethodImplOptions . NoInlining ) ]
74
- private IntPtr LowLevelKeyboardProc ( int nCode , UIntPtr wParam , IntPtr lParam )
62
+ private static IntPtr LowLevelKeyboardProc ( int nCode , UIntPtr wParam , IntPtr lParam )
75
63
{
76
64
bool continues = true ;
77
65
@@ -94,12 +82,7 @@ private IntPtr LowLevelKeyboardProc(int nCode, UIntPtr wParam, IntPtr lParam)
94
82
return ( IntPtr ) 1 ;
95
83
}
96
84
97
- ~ GlobalHotkey ( )
98
- {
99
- Dispose ( ) ;
100
- }
101
-
102
- public void Dispose ( )
85
+ public static void Dispose ( )
103
86
{
104
87
InterceptKeys . UnhookWindowsHookEx ( hookId ) ;
105
88
}
0 commit comments