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);