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