UWP:检测app获得/失去焦点

我希望能够通过使用DisplayRequest类来阻止屏幕保护程序在我的应用程序使用时触发,但我只想在活动应用程序时执行此操作。 如果用户切换到另一个窗口/应用程序,那么我想像一个好公民,并再次允许屏幕保护程序。

我无法看到一种明显的方法来检测UWP应用何时获得/失去焦点(或被激活/停用)并且快速搜索并不能提供任何见解。 谁能指出我正确的方向?

您不应该处理应用程序激活状态的更改。

请参阅如何防止UWP应用程序中的屏幕锁定 。

自动请求处理

但是,如果没有任何其他编码,当您的应用不再具有焦点时,您的RequestActive()调用也将被停用 – 换句话说,当您的应用进入暂停状态时。 在Windows Phone移动设备和Windows 10 PC或平板电脑模式下的Surface Pro上,“您的应用程序不再具有焦点”意味着只要您的应用程序不再位于前台(顺便说一句,快照应用程序仍然算在前台) 。 但是,在桌面模式的Windows 10 PC上,无论您的应用程序何时最小化,都将意味着它。 在桌面模式下,请注意即使另一个应用程序窗口占用了您的应用程序窗口,UWP应用程序生命周期仍会将您的应用程序视为在前台运行。

非常酷的是,当您的应用程序回到前台或被去除最小化时,RequestActive()调用将自动重新激活。 你不需要做任何事情!

这也意味着如果另一个应用程序发生请求以保持显示活动,它不能劫持同一设备上每个其他应用程序的行为。 只要用户使用该应用程序,该请求就会很好。 一旦应用程序被解雇或最小化,Windows 10就会恢复其常规的节能习惯,即使应用程序忘记调用RequestRelease()。

最后,当您的应用程序终止时,将自动清除所有剩余的显示活动请求。

这一切都是为了您的需求而制作的。

它实际上非常简单:

Window.Current.Activated += Current_Activated; private void Current_Activated(object sender, Windows.UI.Core.WindowActivatedEventArgs e) { if (e.WindowActivationState == CoreWindowActivationState.Deactivated) { // do stuff } else { // do different stuff } } 

我们可以使用CoreWindow.Activated事件来检测何时激活或停用UWP应用程序。 当窗口完成激活或取消激活时,将触发此方法。 对于UWP应用程序,我们通常只有一个窗口。 所以我们可以在Application.OnLaunched方法中添加一些像下面这样的代码来检测:

 Window.Current.CoreWindow.Activated += (sender, args) => { if (args.WindowActivationState == Windows.UI.Core.CoreWindowActivationState.Deactivated) { System.Diagnostics.Debug.WriteLine("Deactivated " + DateTime.Now); } else { System.Diagnostics.Debug.WriteLine("Activated " + DateTime.Now); } }; 

除此之外,您还可以使用CoreApplication.GetCurrentView方法或CoreWindow.GetForCurrentThread方法来获取CoreWindow

我在主窗口上使用可见性更改事件。 在应用程序中打开或关闭新窗口时不会触发该事件。

 Window.Current.VisibilityChanged += OnVisibilityChanged; ///  /// When the window visibility changes, the stuff happens ///  /// object sender /// VisibilityChangedEventArgs e private void OnVisibilityChanged(object sender, VisibilityChangedEventArgs e) { if (!e.Visible) { // do stuff } else { // do other stuff } }