diff --git a/Wox.Core/UserSettings/UserSettingStorage.cs b/Wox.Core/UserSettings/UserSettingStorage.cs index c01538e623..75f00ce48a 100644 --- a/Wox.Core/UserSettings/UserSettingStorage.cs +++ b/Wox.Core/UserSettings/UserSettingStorage.cs @@ -86,6 +86,9 @@ namespace Wox.Core.UserSettings [JsonProperty] public bool RememberLastLaunchLocation { get; set; } + [JsonProperty] + public bool IgnoreHotkeysOnTopMostFocus { get; set; } + [JsonProperty] public string ProxyServer { get; set; } diff --git a/Wox/Helper/WindowIntelopHelper.cs b/Wox/Helper/WindowIntelopHelper.cs index 2e5179b7b4..caf7c2a89c 100644 --- a/Wox/Helper/WindowIntelopHelper.cs +++ b/Wox/Helper/WindowIntelopHelper.cs @@ -10,14 +10,28 @@ namespace Wox.Helper public class WindowIntelopHelper { private const int GWL_STYLE = -16; //WPF's Message code for Title Bar's Style + private const int GWL_EXSTYLE = -20; //Gets the exstyle of the window + private const int WS_EX_TOPMOST = 0x00000008; //Topmost flag private const int WS_SYSMENU = 0x80000; //WPF's Message code for System Menu - + [DllImport("user32.dll", SetLastError = true)] private static extern int GetWindowLong(IntPtr hWnd, int nIndex); [DllImport("user32.dll")] private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); + [DllImport("user32.dll")] + private static extern IntPtr GetForegroundWindow(); + + /// + ///Checks if the foreground window is TopMost (even Wox) + /// + /// + public static bool IsForegroundWindowTopMost() + { + return (GetWindowLong(GetForegroundWindow(), GWL_EXSTYLE) & WS_EX_TOPMOST) == WS_EX_TOPMOST; + } + /// /// disable windows toolbar's control box /// this will also disable system menu with Alt+Space hotkey diff --git a/Wox/Languages/en.xaml b/Wox/Languages/en.xaml index 3d0946aa3b..5871b9fae2 100644 --- a/Wox/Languages/en.xaml +++ b/Wox/Languages/en.xaml @@ -23,6 +23,7 @@ Remember last launch location Language Maximum show results + Ignore hotkeys if foreground window is TopMost Plugin diff --git a/Wox/Languages/ru.xaml b/Wox/Languages/ru.xaml index efb3d9521a..ebf3f14886 100644 --- a/Wox/Languages/ru.xaml +++ b/Wox/Languages/ru.xaml @@ -23,6 +23,7 @@ Запомнить последнее место запуска Язык Максимальное количество результатов + Игнорировать горячие клавиши, если окно в фокусе самое верхнее Плагины diff --git a/Wox/Languages/zh-cn.xaml b/Wox/Languages/zh-cn.xaml index e2ab87c4b2..7768be27ee 100644 --- a/Wox/Languages/zh-cn.xaml +++ b/Wox/Languages/zh-cn.xaml @@ -23,6 +23,7 @@ 记住上次启动位置 语言 最大结果显示个数 + Ignore hotkeys if foreground window is TopMost 插件 diff --git a/Wox/Languages/zh-tw.xaml b/Wox/Languages/zh-tw.xaml index c0fd4a63b5..ae59971755 100644 --- a/Wox/Languages/zh-tw.xaml +++ b/Wox/Languages/zh-tw.xaml @@ -23,6 +23,7 @@ 记住上次启动位置 語言 最大結果顯示個數 + Ignore hotkeys if foreground window is TopMost 插件 diff --git a/Wox/MainWindow.xaml.cs b/Wox/MainWindow.xaml.cs index 35e7df4965..01d9f94f79 100644 --- a/Wox/MainWindow.xaml.cs +++ b/Wox/MainWindow.xaml.cs @@ -356,6 +356,20 @@ namespace Wox } } + /// + /// Checks if Wox should ignore any hotkeys + /// + /// + private bool ShouldIgnoreHotkeys() + { + + if (!IsVisible + && UserSettingStorage.Instance.IgnoreHotkeysOnTopMostFocus + && WindowIntelopHelper.IsForegroundWindowTopMost()) + return true; + return false; + } + private void SetCustomPluginHotkey() { if (UserSettingStorage.Instance.CustomPluginHotkeys == null) return; @@ -364,6 +378,7 @@ namespace Wox CustomPluginHotkey hotkey1 = hotkey; SetHotkey(hotkey.Hotkey, delegate { + if (ShouldIgnoreHotkeys()) return; ShowApp(); ChangeQuery(hotkey1.ActionKeyword, true); }); @@ -372,6 +387,7 @@ namespace Wox private void OnHotkey(object sender, HotkeyEventArgs e) { + if (ShouldIgnoreHotkeys()) return; ToggleWox(); e.Handled = true; } diff --git a/Wox/SettingWindow.xaml b/Wox/SettingWindow.xaml index ac40627a54..bc504df44c 100644 --- a/Wox/SettingWindow.xaml +++ b/Wox/SettingWindow.xaml @@ -35,6 +35,9 @@ + + + diff --git a/Wox/SettingWindow.xaml.cs b/Wox/SettingWindow.xaml.cs index 7ede741c6a..36021206de 100644 --- a/Wox/SettingWindow.xaml.cs +++ b/Wox/SettingWindow.xaml.cs @@ -49,7 +49,6 @@ namespace Wox private void Setting_Loaded(object sender, RoutedEventArgs ev) { #region General - cbHideWhenDeactive.Checked += (o, e) => { UserSettingStorage.Instance.HideWhenDeactive = true; @@ -86,6 +85,20 @@ namespace Wox UserSettingStorage.Instance.Save(); }; + cbIgnoreHotkeysIfWindowIsTopmost.Checked += (o, e) => + { + UserSettingStorage.Instance.IgnoreHotkeysOnTopMostFocus = true; + UserSettingStorage.Instance.Save(); + }; + + + cbIgnoreHotkeysIfWindowIsTopmost.Unchecked += (o, e) => + { + UserSettingStorage.Instance.IgnoreHotkeysOnTopMostFocus = false; + UserSettingStorage.Instance.Save(); + }; + + cbStartWithWindows.IsChecked = CheckApplicationIsStartupWithWindow(); comboMaxResultsToShow.SelectionChanged += (o, e) => { @@ -97,6 +110,7 @@ namespace Wox cbHideWhenDeactive.IsChecked = UserSettingStorage.Instance.HideWhenDeactive; cbDontPromptUpdateMsg.IsChecked = UserSettingStorage.Instance.DontPromptUpdateMsg; cbRememberLastLocation.IsChecked = UserSettingStorage.Instance.RememberLastLaunchLocation; + cbIgnoreHotkeysIfWindowIsTopmost.IsChecked = UserSettingStorage.Instance.IgnoreHotkeysOnTopMostFocus; LoadLanguages(); comboMaxResultsToShow.ItemsSource = Enumerable.Range(2, 16);