diff --git a/src/modules/ShortcutGuide/ShortcutGuide.Ui/Helpers/ShortcutGuideActivationPolicy.cs b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Helpers/ShortcutGuideActivationPolicy.cs index 3a6aad81b0..d2e4498d0c 100644 --- a/src/modules/ShortcutGuide/ShortcutGuide.Ui/Helpers/ShortcutGuideActivationPolicy.cs +++ b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Helpers/ShortcutGuideActivationPolicy.cs @@ -33,10 +33,16 @@ public static class ShortcutGuideActivationPolicy public static ShortcutGuideActivationAction GetActivationAction( ShortcutGuideActivationSource activationSource, bool isOverlayVisible, + bool isCurrentWindowExcluded, ShortcutGuideActivationSource activeSource, ShortcutGuideOverlaySurface activeSurface, ShortcutGuideWindowsKeyAction windowsKeyAction) { + if (!isOverlayVisible && isCurrentWindowExcluded) + { + return ShortcutGuideActivationAction.None; + } + if (!isOverlayVisible) { activeSource = ShortcutGuideActivationSource.None; diff --git a/src/modules/ShortcutGuide/ShortcutGuide.Ui/Program.cs b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Program.cs index aa85bb682a..3474cf1e0d 100644 --- a/src/modules/ShortcutGuide/ShortcutGuide.Ui/Program.cs +++ b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Program.cs @@ -55,11 +55,6 @@ namespace ShortcutGuide Directory.CreateDirectory(ManifestInterpreter.PathOfManifestFiles); - if (NativeMethods.IsCurrentWindowExcludedFromShortcutGuide()) - { - return; - } - // Copy every shipped manifest from the install directory to the per-user manifest folder. // Enumerating the source folder avoids drift between the deployed assets and a hard-coded list. // Todo: Only copy files after an update. diff --git a/src/modules/ShortcutGuide/ShortcutGuide.Ui/ShortcutGuideXAML/App.xaml.cs b/src/modules/ShortcutGuide/ShortcutGuide.Ui/ShortcutGuideXAML/App.xaml.cs index c344eef5ad..d6b06005b3 100644 --- a/src/modules/ShortcutGuide/ShortcutGuide.Ui/ShortcutGuideXAML/App.xaml.cs +++ b/src/modules/ShortcutGuide/ShortcutGuide.Ui/ShortcutGuideXAML/App.xaml.cs @@ -251,16 +251,24 @@ namespace ShortcutGuide try { bool isOverlayVisible = OverlayWindow.AppWindow.IsVisible; + bool isCurrentWindowExcluded = + !isOverlayVisible && NativeMethods.IsCurrentWindowExcludedFromShortcutGuide(); var activeSource = (ShortcutGuideActivationSource)Volatile.Read(ref _activeSource); var activeSurface = (ShortcutGuideOverlaySurface)Volatile.Read(ref _activeSurface); var windowsKeyAction = (ShortcutGuideWindowsKeyAction)ShortcutGuideProperties.WindowsKeyAction.Value; var action = ShortcutGuideActivationPolicy.GetActivationAction( activationSource, isOverlayVisible, + isCurrentWindowExcluded, activeSource, activeSurface, windowsKeyAction); + if (isCurrentWindowExcluded) + { + Logger.LogInfo("Shortcut Guide activation suppressed because the foreground application is excluded."); + } + Logger.LogInfo($"Shortcut Guide activation action: {action}."); switch (action) { diff --git a/src/modules/ShortcutGuide/ShortcutGuide.UnitTests/ActivationTests/ShortcutGuideActivationPolicyTests.cs b/src/modules/ShortcutGuide/ShortcutGuide.UnitTests/ActivationTests/ShortcutGuideActivationPolicyTests.cs index 408e28699a..c8edf38777 100644 --- a/src/modules/ShortcutGuide/ShortcutGuide.UnitTests/ActivationTests/ShortcutGuideActivationPolicyTests.cs +++ b/src/modules/ShortcutGuide/ShortcutGuide.UnitTests/ActivationTests/ShortcutGuideActivationPolicyTests.cs @@ -22,6 +22,7 @@ public sealed class ShortcutGuideActivationPolicyTests var action = ShortcutGuideActivationPolicy.GetActivationAction( ShortcutGuideActivationSource.WindowsKeyHold, isOverlayVisible: false, + isCurrentWindowExcluded: false, ShortcutGuideActivationSource.None, ShortcutGuideOverlaySurface.Hidden, windowsKeyAction); @@ -38,6 +39,7 @@ public sealed class ShortcutGuideActivationPolicyTests var action = ShortcutGuideActivationPolicy.GetActivationAction( ShortcutGuideActivationSource.RegularHotkey, isOverlayVisible: false, + isCurrentWindowExcluded: false, ShortcutGuideActivationSource.None, ShortcutGuideOverlaySurface.Hidden, windowsKeyAction); @@ -51,6 +53,7 @@ public sealed class ShortcutGuideActivationPolicyTests var action = ShortcutGuideActivationPolicy.GetActivationAction( ShortcutGuideActivationSource.RegularHotkey, isOverlayVisible: true, + isCurrentWindowExcluded: false, ShortcutGuideActivationSource.WindowsKeyHold, ShortcutGuideOverlaySurface.TaskbarIndicators, ShortcutGuideWindowsKeyAction.TaskbarIndicators); @@ -64,6 +67,7 @@ public sealed class ShortcutGuideActivationPolicyTests var action = ShortcutGuideActivationPolicy.GetActivationAction( ShortcutGuideActivationSource.RegularHotkey, isOverlayVisible: true, + isCurrentWindowExcluded: false, ShortcutGuideActivationSource.WindowsKeyHold, ShortcutGuideOverlaySurface.FullGuide, ShortcutGuideWindowsKeyAction.OpenShortcutGuide); @@ -77,6 +81,7 @@ public sealed class ShortcutGuideActivationPolicyTests var action = ShortcutGuideActivationPolicy.GetActivationAction( ShortcutGuideActivationSource.RegularHotkey, isOverlayVisible: true, + isCurrentWindowExcluded: false, ShortcutGuideActivationSource.RegularHotkey, ShortcutGuideOverlaySurface.FullGuide, ShortcutGuideWindowsKeyAction.TaskbarIndicators); @@ -90,6 +95,7 @@ public sealed class ShortcutGuideActivationPolicyTests var action = ShortcutGuideActivationPolicy.GetActivationAction( ShortcutGuideActivationSource.WindowsKeyHold, isOverlayVisible: true, + isCurrentWindowExcluded: false, ShortcutGuideActivationSource.RegularHotkey, ShortcutGuideOverlaySurface.FullGuide, ShortcutGuideWindowsKeyAction.OpenShortcutGuide); @@ -97,6 +103,50 @@ public sealed class ShortcutGuideActivationPolicyTests Assert.AreEqual(ShortcutGuideActivationAction.None, action); } + [TestMethod] + [DataRow(ShortcutGuideActivationSource.RegularHotkey, ShortcutGuideWindowsKeyAction.TaskbarIndicators)] + [DataRow(ShortcutGuideActivationSource.WindowsKeyHold, ShortcutGuideWindowsKeyAction.TaskbarIndicators)] + [DataRow(ShortcutGuideActivationSource.WindowsKeyHold, ShortcutGuideWindowsKeyAction.OpenShortcutGuide)] + public void GetActivationAction_ExcludedApp_SuppressesHiddenOverlay( + ShortcutGuideActivationSource activationSource, + ShortcutGuideWindowsKeyAction windowsKeyAction) + { + var action = ShortcutGuideActivationPolicy.GetActivationAction( + activationSource, + isOverlayVisible: false, + isCurrentWindowExcluded: true, + ShortcutGuideActivationSource.None, + ShortcutGuideOverlaySurface.Hidden, + windowsKeyAction); + + Assert.AreEqual(ShortcutGuideActivationAction.None, action); + } + + [TestMethod] + [DataRow( + ShortcutGuideActivationSource.RegularHotkey, + ShortcutGuideOverlaySurface.FullGuide, + ShortcutGuideActivationAction.Close)] + [DataRow( + ShortcutGuideActivationSource.WindowsKeyHold, + ShortcutGuideOverlaySurface.TaskbarIndicators, + ShortcutGuideActivationAction.ShowFullGuide)] + public void GetActivationAction_ExcludedApp_DoesNotSuppressVisibleOverlay( + ShortcutGuideActivationSource activeSource, + ShortcutGuideOverlaySurface activeSurface, + ShortcutGuideActivationAction expected) + { + var action = ShortcutGuideActivationPolicy.GetActivationAction( + ShortcutGuideActivationSource.RegularHotkey, + isOverlayVisible: true, + isCurrentWindowExcluded: true, + activeSource, + activeSurface, + ShortcutGuideWindowsKeyAction.TaskbarIndicators); + + Assert.AreEqual(expected, action); + } + [TestMethod] [DataRow(ShortcutGuideActivationSource.RegularHotkey, ShortcutGuideOverlaySurface.FullGuide, true, false)] [DataRow(ShortcutGuideActivationSource.RegularHotkey, ShortcutGuideOverlaySurface.FullGuide, false, false)]