1
- using System ;
1
+ using System ;
2
+ using System . Diagnostics ;
2
3
using System . Runtime . InteropServices ;
3
4
using Flow . Launcher . Plugin ;
5
+ using Windows . Win32 ;
6
+ using Windows . Win32 . Foundation ;
7
+ using Windows . Win32 . UI . Input . KeyboardAndMouse ;
8
+ using Windows . Win32 . UI . WindowsAndMessaging ;
4
9
5
10
namespace Flow . Launcher . Infrastructure . Hotkey
6
11
{
@@ -10,44 +15,41 @@ namespace Flow.Launcher.Infrastructure.Hotkey
10
15
/// </summary>
11
16
public unsafe class GlobalHotkey : IDisposable
12
17
{
13
- private static readonly IntPtr hookId ;
14
-
15
-
16
-
17
- public delegate bool KeyboardCallback ( KeyEvent keyEvent , int vkCode , SpecialKeyState state ) ;
18
- internal static Func < KeyEvent , int , SpecialKeyState , bool > hookedKeyboardCallback ;
18
+ private static readonly UnhookWindowsHookExSafeHandle hookId ;
19
19
20
- //Modifier key constants
21
- private const int VK_SHIFT = 0x10 ;
22
- private const int VK_CONTROL = 0x11 ;
23
- private const int VK_ALT = 0x12 ;
24
- private const int VK_WIN = 91 ;
20
+ public delegate bool KeyboardCallback ( int keyEvent , int vkCode , SpecialKeyState state ) ;
21
+ internal static Func < KeyEvent , int , SpecialKeyState , bool > hookedKeyboardCallback ;
25
22
26
23
static GlobalHotkey ( )
27
24
{
28
25
// Set the hook
29
- hookId = InterceptKeys . SetHook ( & LowLevelKeyboardProc ) ;
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 ) ;
30
32
}
31
33
32
34
public static SpecialKeyState CheckModifiers ( )
33
35
{
34
36
SpecialKeyState state = new SpecialKeyState ( ) ;
35
- if ( ( InterceptKeys . GetKeyState ( VK_SHIFT ) & 0x8000 ) != 0 )
37
+ if ( ( PInvoke . GetKeyState ( ( int ) VIRTUAL_KEY . VK_SHIFT ) & 0x8000 ) != 0 )
36
38
{
37
39
//SHIFT is pressed
38
40
state . ShiftPressed = true ;
39
41
}
40
- if ( ( InterceptKeys . GetKeyState ( VK_CONTROL ) & 0x8000 ) != 0 )
42
+ if ( ( PInvoke . GetKeyState ( ( int ) VIRTUAL_KEY . VK_CONTROL ) & 0x8000 ) != 0 )
41
43
{
42
44
//CONTROL is pressed
43
45
state . CtrlPressed = true ;
44
46
}
45
- if ( ( InterceptKeys . GetKeyState ( VK_ALT ) & 0x8000 ) != 0 )
47
+ if ( ( PInvoke . GetKeyState ( ( int ) VIRTUAL_KEY . VK_MENU ) & 0x8000 ) != 0 )
46
48
{
47
49
//ALT is pressed
48
50
state . AltPressed = true ;
49
51
}
50
- if ( ( InterceptKeys . GetKeyState ( VK_WIN ) & 0x8000 ) != 0 )
52
+ if ( ( PInvoke . GetKeyState ( ( int ) VIRTUAL_KEY . VK_LWIN ) & 0x8000 ) != 0 )
51
53
{
52
54
//WIN is pressed
53
55
state . WinPressed = true ;
@@ -56,38 +58,38 @@ public static SpecialKeyState CheckModifiers()
56
58
return state ;
57
59
}
58
60
59
- [ UnmanagedCallersOnly ]
60
- private static IntPtr LowLevelKeyboardProc ( int nCode , UIntPtr wParam , IntPtr lParam )
61
+ private static LRESULT LowLevelKeyboardProc ( int nCode , WPARAM wParam , LPARAM lParam )
61
62
{
62
63
bool continues = true ;
63
64
64
65
if ( nCode >= 0 )
65
66
{
66
- if ( wParam . ToUInt32 ( ) == ( int ) KeyEvent . WM_KEYDOWN ||
67
- wParam . ToUInt32 ( ) == ( int ) KeyEvent . WM_KEYUP ||
68
- wParam . ToUInt32 ( ) == ( int ) KeyEvent . WM_SYSKEYDOWN ||
69
- wParam . ToUInt32 ( ) == ( int ) KeyEvent . WM_SYSKEYUP )
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
72
{
71
73
if ( hookedKeyboardCallback != null )
72
- continues = hookedKeyboardCallback ( ( KeyEvent ) wParam . ToUInt32 ( ) , Marshal . ReadInt32 ( lParam ) , CheckModifiers ( ) ) ;
74
+ continues = hookedKeyboardCallback ( ( KeyEvent ) wParamValue , Marshal . ReadInt32 ( lParam ) , CheckModifiers ( ) ) ;
73
75
}
74
76
}
75
77
76
78
if ( continues )
77
79
{
78
- return InterceptKeys . CallNextHookEx ( hookId , nCode , wParam , lParam ) ;
80
+ return PInvoke . CallNextHookEx ( hookId , nCode , wParam , lParam ) ;
79
81
}
80
- return ( IntPtr ) ( - 1 ) ;
82
+ return new LRESULT ( - 1 ) ;
81
83
}
82
84
83
85
public void Dispose ( )
84
86
{
85
- InterceptKeys . UnhookWindowsHookEx ( hookId ) ;
87
+ PInvoke . UnhookWindowsHookEx ( new HHOOK ( hookId . DangerousGetHandle ( ) ) ) ;
86
88
}
87
89
88
90
~ GlobalHotkey ( )
89
91
{
90
92
Dispose ( ) ;
91
93
}
92
94
}
93
- }
95
+ }
0 commit comments