diff --git a/Wox.Core/UserSettings/UserSettingStorage.cs b/Wox.Core/UserSettings/UserSettingStorage.cs
index c01538e623..632aaaa507 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 IgnoreHotkeysOnFullscreen { get; set; }
+
[JsonProperty]
public string ProxyServer { get; set; }
diff --git a/Wox/Helper/WindowIntelopHelper.cs b/Wox/Helper/WindowIntelopHelper.cs
index 2e5179b7b4..feccd8f6a4 100644
--- a/Wox/Helper/WindowIntelopHelper.cs
+++ b/Wox/Helper/WindowIntelopHelper.cs
@@ -1,9 +1,9 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows;
+using System.Windows.Forms;
+using System.Windows.Interop;
namespace Wox.Helper
{
@@ -11,6 +11,25 @@ namespace Wox.Helper
{
private const int GWL_STYLE = -16; //WPF's Message code for Title Bar's Style
private const int WS_SYSMENU = 0x80000; //WPF's Message code for System Menu
+ private static IntPtr _hwnd_shell;
+ private static IntPtr _hwnd_desktop;
+
+ //Accessors for shell and desktop handlers
+ //Will set the variables once and then will return them
+ private static IntPtr HWND_SHELL
+ {
+ get
+ {
+ return _hwnd_shell != null ? _hwnd_shell : _hwnd_shell = GetShellWindow();
+ }
+ }
+ private static IntPtr HWND_DESKTOP
+ {
+ get
+ {
+ return _hwnd_desktop != null ? _hwnd_desktop : _hwnd_desktop = GetDesktopWindow();
+ }
+ }
[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
@@ -18,14 +37,56 @@ namespace Wox.Helper
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
+ [DllImport("user32.dll")]
+ private static extern IntPtr GetForegroundWindow();
+
+ [DllImport("user32.dll")]
+ private static extern IntPtr GetDesktopWindow();
+
+ [DllImport("user32.dll")]
+ private static extern IntPtr GetShellWindow();
+
+ [DllImport("user32.dll", SetLastError = true)]
+ private static extern int GetWindowRect(IntPtr hwnd, out RECT rc);
+
+ public static bool IsWindowFullscreen()
+ {
+ RECT foreWinBounds;
+ Rectangle screenBounds;
+ var hWnd = GetForegroundWindow();
+ if (!hWnd.Equals(IntPtr.Zero))
+ {
+ if (!(hWnd.Equals(HWND_DESKTOP) || hWnd.Equals(HWND_SHELL)))
+ {
+ GetWindowRect(hWnd, out foreWinBounds);
+ screenBounds = Screen.FromHandle(hWnd).Bounds;
+ if ((foreWinBounds.Bottom - foreWinBounds.Top) == screenBounds.Height && (foreWinBounds.Right - foreWinBounds.Left) == screenBounds.Width)
+ {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
///
- /// disable windows toolbar's control box
- /// this will also disable system menu with Alt+Space hotkey
+ /// disable windows toolbar's control box
+ /// this will also disable system menu with Alt+Space hotkey
///
public static void DisableControlBox(Window win)
{
- var hwnd = new System.Windows.Interop.WindowInteropHelper(win).Handle;
+ var hwnd = new WindowInteropHelper(win).Handle;
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);
}
+
+ [StructLayout(LayoutKind.Sequential)]
+ public struct RECT
+ {
+ public int Left;
+ public int Top;
+ public int Right;
+ public int Bottom;
+ }
}
-}
+}
\ No newline at end of file
diff --git a/Wox/Languages/en.xaml b/Wox/Languages/en.xaml
index 3d0946aa3b..fe252ebb98 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 window is fullscreen
Plugin
diff --git a/Wox/Languages/ru.xaml b/Wox/Languages/ru.xaml
index efb3d9521a..e09aa9bc73 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..7e00547603 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..0f1ab8f9c4 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..9e305ff40c 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()
+ {
+ //double if to omit calling win32 function
+ if (UserSettingStorage.Instance.IgnoreHotkeysOnFullscreen)
+ if(WindowIntelopHelper.IsWindowFullscreen())
+ 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..b322cf16d5 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..5520b4c534 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();
};
+ cbIgnoreHotkeysOnFullscreen.Checked += (o, e) =>
+ {
+ UserSettingStorage.Instance.IgnoreHotkeysOnFullscreen = true;
+ UserSettingStorage.Instance.Save();
+ };
+
+
+ cbIgnoreHotkeysOnFullscreen.Unchecked += (o, e) =>
+ {
+ UserSettingStorage.Instance.IgnoreHotkeysOnFullscreen = 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;
+ cbIgnoreHotkeysOnFullscreen.IsChecked = UserSettingStorage.Instance.IgnoreHotkeysOnFullscreen;
LoadLanguages();
comboMaxResultsToShow.ItemsSource = Enumerable.Range(2, 16);