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

时间:2016-01-12 22:56:28

标签: c# uwp

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

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

4 个答案:

答案 0 :(得分:13)

实际上非常简单:

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
    }
}

答案 1 :(得分:8)

我们可以使用CoreWindow.Activated event来检测何时激活或停用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 methodCoreWindow.GetForCurrentThread method获取CoreWindow

答案 2 :(得分:3)

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

请参阅How to prevent screen locks in your UWP apps

  

自动请求处理

     

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

     

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

     

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

     

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

这一切都是为了满足您的需求。

答案 3 :(得分:1)

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

Window.Current.VisibilityChanged += OnVisibilityChanged;

/// <summary>
/// When the window visibility changes, the stuff happens
/// </summary>
/// <param name="sender">object sender</param>
/// <param name="e">VisibilityChangedEventArgs e</param>
private void OnVisibilityChanged(object sender, VisibilityChangedEventArgs e)
{

    if (!e.Visible)
    {
       // do stuff
    }
    else
    {
       // do other stuff
    }
}