@@ -9,41 +9,28 @@ namespace Flow.Launcher.Infrastructure.Hotkey
99 /// Listens keyboard globally.
1010 /// <remarks>Uses WH_KEYBOARD_LL.</remarks>
1111 /// </summary>
12- public class GlobalHotkey : IDisposable
12+ public unsafe class GlobalHotkey : IDisposable
1313 {
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+
1718 public delegate bool KeyboardCallback ( KeyEvent keyEvent , int vkCode , SpecialKeyState state ) ;
18- public event KeyboardCallback hookedKeyboardCallback ;
19+ internal static Func < KeyEvent , int , SpecialKeyState , bool > hookedKeyboardCallback ;
1920
2021 //Modifier key constants
2122 private const int VK_SHIFT = 0x10 ;
2223 private const int VK_CONTROL = 0x11 ;
2324 private const int VK_ALT = 0x12 ;
2425 private const int VK_WIN = 91 ;
2526
26- public static GlobalHotkey Instance
27+ static GlobalHotkey ( )
2728 {
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 ;
4229 // Set the hook
43- hookId = InterceptKeys . SetHook ( hookedLowLevelKeyboardProc ) ;
30+ hookId = InterceptKeys . SetHook ( & LowLevelKeyboardProc ) ;
4431 }
4532
46- public SpecialKeyState CheckModifiers ( )
33+ public static SpecialKeyState CheckModifiers ( )
4734 {
4835 SpecialKeyState state = new SpecialKeyState ( ) ;
4936 if ( ( InterceptKeys . GetKeyState ( VK_SHIFT ) & 0x8000 ) != 0 )
@@ -70,8 +57,8 @@ public SpecialKeyState CheckModifiers()
7057 return state ;
7158 }
7259
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 )
7562 {
7663 bool continues = true ;
7764
@@ -91,17 +78,17 @@ private IntPtr LowLevelKeyboardProc(int nCode, UIntPtr wParam, IntPtr lParam)
9178 {
9279 return InterceptKeys . CallNextHookEx ( hookId , nCode , wParam , lParam ) ;
9380 }
94- return ( IntPtr ) 1 ;
81+ return ( IntPtr ) ( - 1 ) ;
9582 }
9683
97- ~ GlobalHotkey ( )
84+ public void Dispose ( )
9885 {
99- Dispose ( ) ;
86+ InterceptKeys . UnhookWindowsHookEx ( hookId ) ;
10087 }
10188
102- public void Dispose ( )
89+ ~ GlobalHotkey ( )
10390 {
104- InterceptKeys . UnhookWindowsHookEx ( hookId ) ;
91+ Dispose ( ) ;
10592 }
10693 }
10794}
0 commit comments