@@ -9,41 +9,28 @@ 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 class GlobalHotkey : IDisposable
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 ) ;
44
31
}
45
32
46
- public SpecialKeyState CheckModifiers ( )
33
+ public static SpecialKeyState CheckModifiers ( )
47
34
{
48
35
SpecialKeyState state = new SpecialKeyState ( ) ;
49
36
if ( ( InterceptKeys . GetKeyState ( VK_SHIFT ) & 0x8000 ) != 0 )
@@ -70,8 +57,8 @@ public SpecialKeyState CheckModifiers()
70
57
return state ;
71
58
}
72
59
73
- [ MethodImpl ( MethodImplOptions . NoInlining ) ]
74
- private IntPtr LowLevelKeyboardProc ( int nCode , UIntPtr wParam , IntPtr lParam )
60
+ [ UnmanagedCallersOnly ]
61
+ private static IntPtr LowLevelKeyboardProc ( int nCode , UIntPtr wParam , IntPtr lParam )
75
62
{
76
63
bool continues = true ;
77
64
@@ -91,17 +78,17 @@ private IntPtr LowLevelKeyboardProc(int nCode, UIntPtr wParam, IntPtr lParam)
91
78
{
92
79
return InterceptKeys . CallNextHookEx ( hookId , nCode , wParam , lParam ) ;
93
80
}
94
- return ( IntPtr ) 1 ;
81
+ return ( IntPtr ) ( - 1 ) ;
95
82
}
96
83
97
- ~ GlobalHotkey ( )
84
+ public void Dispose ( )
98
85
{
99
- Dispose ( ) ;
86
+ InterceptKeys . UnhookWindowsHookEx ( hookId ) ;
100
87
}
101
88
102
- public void Dispose ( )
89
+ ~ GlobalHotkey ( )
103
90
{
104
- InterceptKeys . UnhookWindowsHookEx ( hookId ) ;
91
+ Dispose ( ) ;
105
92
}
106
93
}
107
94
}
0 commit comments