diff --git a/Wox.Infrastructure/GloablHotkey.cs b/Wox.Infrastructure/GlobalHotkey.cs similarity index 98% rename from Wox.Infrastructure/GloablHotkey.cs rename to Wox.Infrastructure/GlobalHotkey.cs index 22602d27d..be7cde76a 100644 --- a/Wox.Infrastructure/GloablHotkey.cs +++ b/Wox.Infrastructure/GlobalHotkey.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Diagnostics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -29,93 +29,6 @@ namespace Wox.Infrastructure WM_SYSKEYDOWN = 260 } - /// - /// Listens keyboard globally. - /// Uses WH_KEYBOARD_LL. - /// - public class GloablHotkey : IDisposable - { - private InterceptKeys.LowLevelKeyboardProc hookedLowLevelKeyboardProc; - private IntPtr hookId = IntPtr.Zero; - public delegate bool KeyboardCallback(KeyEvent keyEvent, int vkCode, SpecialKeyState state); - public event KeyboardCallback hookedKeyboardCallback; - - //Modifier key constants - private const int VK_SHIFT = 0x10; - private const int VK_CONTROL = 0x11; - private const int VK_ALT = 0x12; - private const int VK_WIN = 91; - - public GloablHotkey() - { - // We have to store the LowLevelKeyboardProc, so that it is not garbage collected runtime - hookedLowLevelKeyboardProc = LowLevelKeyboardProc; - // Set the hook - hookId = InterceptKeys.SetHook(hookedLowLevelKeyboardProc); - } - - public SpecialKeyState CheckModifiers() - { - SpecialKeyState state = new SpecialKeyState(); - if ((InterceptKeys.GetKeyState(VK_SHIFT) & 0x8000) != 0) - { - //SHIFT is pressed - state.ShiftPressed = true; - } - if ((InterceptKeys.GetKeyState(VK_CONTROL) & 0x8000) != 0) - { - //CONTROL is pressed - state.CtrlPressed = true; - } - if ((InterceptKeys.GetKeyState(VK_ALT) & 0x8000) != 0) - { - //ALT is pressed - state.AltPressed = true; - } - if ((InterceptKeys.GetKeyState(VK_WIN) & 0x8000) != 0) - { - //ALT is pressed - state.WinPressed = true; - } - - return state; - } - - [MethodImpl(MethodImplOptions.NoInlining)] - private IntPtr LowLevelKeyboardProc(int nCode, UIntPtr wParam, IntPtr lParam) - { - bool continues = true; - - if (nCode >= 0) - { - if (wParam.ToUInt32() == (int)KeyEvent.WM_KEYDOWN || - wParam.ToUInt32() == (int)KeyEvent.WM_KEYUP || - wParam.ToUInt32() == (int)KeyEvent.WM_SYSKEYDOWN || - wParam.ToUInt32() == (int)KeyEvent.WM_SYSKEYUP) - { - if (hookedKeyboardCallback != null) - continues = hookedKeyboardCallback((KeyEvent)wParam.ToUInt32(), Marshal.ReadInt32(lParam), CheckModifiers()); - } - } - - if (continues) - { - return InterceptKeys.CallNextHookEx(hookId, nCode, wParam, lParam); - } - return (IntPtr)1; - } - - ~GloablHotkey() - { - Dispose(); - } - - public void Dispose() - { - InterceptKeys.UnhookWindowsHookEx(hookId); - } - } - public static class InterceptKeys { public delegate IntPtr LowLevelKeyboardProc(int nCode, UIntPtr wParam, IntPtr lParam); @@ -189,4 +102,91 @@ namespace Wox.Infrastructure public Int16 wParamL; public Int16 wParamH; } + + /// + /// Listens keyboard globally. + /// Uses WH_KEYBOARD_LL. + /// + public class GlobalHotkey : IDisposable + { + private InterceptKeys.LowLevelKeyboardProc hookedLowLevelKeyboardProc; + private IntPtr hookId = IntPtr.Zero; + public delegate bool KeyboardCallback(KeyEvent keyEvent, int vkCode, SpecialKeyState state); + public event KeyboardCallback hookedKeyboardCallback; + + //Modifier key constants + private const int VK_SHIFT = 0x10; + private const int VK_CONTROL = 0x11; + private const int VK_ALT = 0x12; + private const int VK_WIN = 91; + + public GlobalHotkey() + { + // We have to store the LowLevelKeyboardProc, so that it is not garbage collected runtime + hookedLowLevelKeyboardProc = LowLevelKeyboardProc; + // Set the hook + hookId = InterceptKeys.SetHook(hookedLowLevelKeyboardProc); + } + + public SpecialKeyState CheckModifiers() + { + SpecialKeyState state = new SpecialKeyState(); + if ((InterceptKeys.GetKeyState(VK_SHIFT) & 0x8000) != 0) + { + //SHIFT is pressed + state.ShiftPressed = true; + } + if ((InterceptKeys.GetKeyState(VK_CONTROL) & 0x8000) != 0) + { + //CONTROL is pressed + state.CtrlPressed = true; + } + if ((InterceptKeys.GetKeyState(VK_ALT) & 0x8000) != 0) + { + //ALT is pressed + state.AltPressed = true; + } + if ((InterceptKeys.GetKeyState(VK_WIN) & 0x8000) != 0) + { + //ALT is pressed + state.WinPressed = true; + } + + return state; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private IntPtr LowLevelKeyboardProc(int nCode, UIntPtr wParam, IntPtr lParam) + { + bool continues = true; + + if (nCode >= 0) + { + if (wParam.ToUInt32() == (int)KeyEvent.WM_KEYDOWN || + wParam.ToUInt32() == (int)KeyEvent.WM_KEYUP || + wParam.ToUInt32() == (int)KeyEvent.WM_SYSKEYDOWN || + wParam.ToUInt32() == (int)KeyEvent.WM_SYSKEYUP) + { + if (hookedKeyboardCallback != null) + continues = hookedKeyboardCallback((KeyEvent)wParam.ToUInt32(), Marshal.ReadInt32(lParam), CheckModifiers()); + } + } + + if (continues) + { + return InterceptKeys.CallNextHookEx(hookId, nCode, wParam, lParam); + } + return (IntPtr)1; + } + + ~GlobalHotkey() + { + Dispose(); + } + + public void Dispose() + { + InterceptKeys.UnhookWindowsHookEx(hookId); + } + } } \ No newline at end of file diff --git a/Wox.Infrastructure/Wox.Infrastructure.csproj b/Wox.Infrastructure/Wox.Infrastructure.csproj index 19392cf06..06326b2f7 100644 --- a/Wox.Infrastructure/Wox.Infrastructure.csproj +++ b/Wox.Infrastructure/Wox.Infrastructure.csproj @@ -51,7 +51,7 @@ - + diff --git a/Wox/HotkeyControl.xaml.cs b/Wox/HotkeyControl.xaml.cs index 1d64f0fc7..b957f9548 100644 --- a/Wox/HotkeyControl.xaml.cs +++ b/Wox/HotkeyControl.xaml.cs @@ -41,7 +41,7 @@ namespace Wox Key key = (e.Key == Key.System ? e.SystemKey : e.Key); string text = string.Empty; - SpecialKeyState specialKeyState = new GloablHotkey().CheckModifiers(); + SpecialKeyState specialKeyState = new GlobalHotkey().CheckModifiers(); if (specialKeyState.AltPressed) { text += "Alt"; diff --git a/Wox/MainWindow.xaml.cs b/Wox/MainWindow.xaml.cs index d0dbc9048..e42591a8e 100644 --- a/Wox/MainWindow.xaml.cs +++ b/Wox/MainWindow.xaml.cs @@ -35,7 +35,7 @@ namespace Wox public static bool initialized = false; private static readonly List waitShowResultList = new List(); - private readonly GloablHotkey globalHotkey = new GloablHotkey(); + private readonly GlobalHotkey globalHotkey = new GlobalHotkey(); private readonly KeyboardSimulator keyboardSimulator = new KeyboardSimulator(new InputSimulator()); private readonly Storyboard progressBarStoryboard = new Storyboard(); private bool WinRStroked; @@ -104,7 +104,7 @@ namespace Wox } catch (Exception) { - MessageBox.Show("Registe hotkey: " + hotkeyStr + " failed."); + MessageBox.Show("Register hotkey: " + hotkeyStr + " failed."); } } @@ -349,7 +349,7 @@ namespace Wox { bool hideWindow = result.Action(new ActionContext() { - SpecialKeyState = new GloablHotkey().CheckModifiers() + SpecialKeyState = new GlobalHotkey().CheckModifiers() }); if (hideWindow) {