C# UWP:检测应用程序获得/失去焦点

C# UWP:检测应用程序获得/失去焦点,c#,uwp,C#,Uwp,我想通过使用DisplayRequest类防止我的应用程序在使用时触发屏幕保护程序,但我只想在它是活动应用程序时执行此操作。如果用户切换到另一个窗口/应用程序,那么我想表现得像一个好公民,再次允许屏幕保护程序 我看不到一种明显的方法来检测UWP应用程序何时获得/失去焦点(或被激活/停用),快速搜索也不能提供任何洞察。有人能给我指出正确的方向吗?其实很简单: Window.Current.Activated += Current_Activated; private void Current_A

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


我看不到一种明显的方法来检测UWP应用程序何时获得/失去焦点(或被激活/停用),快速搜索也不能提供任何洞察。有人能给我指出正确的方向吗?

其实很简单:

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
    }
}
我们可以使用来检测UWP应用程序何时被激活或停用。此方法在窗口完成激活或停用时激发。对于UWP应用程序,我们通常只有一个窗口。因此,我们可以在
应用程序中添加如下代码。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);
    }
};

除此之外,您还可以使用或获取
CoreWindow

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

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
    }
}
Window.Current.VisibilityChanged+=OnVisibilityChanged;
/// 
///当窗口可见性发生变化时,就会发生这种情况
/// 
///对象发送器
///可视性更改Deventargs e
私有void OnVisibilityChanged(对象发送方,VisibilityChangedEventArgs e)
{
如果(!e.可见)
{
//做事
}
其他的
{
//做其他事情
}
}

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

请参阅

自动请求处理

但是,如果没有任何额外的编码,当您的应用程序不再具有焦点时(换句话说,当您的应用程序进入挂起状态时),您的RequestActive()调用也将被停用。在Windows Phone mobile和平板电脑模式下的Windows 10 PC或Surface Pro上,“你的应用程序不再具有焦点”意味着当你的应用程序不再位于前台时(顺便说一句,抓拍的应用程序仍被视为位于前台)。然而,在桌面模式的Windows10电脑上,这意味着只要你的应用程序最小化。在桌面模式下,请注意,即使另一个应用程序窗口覆盖了您的应用程序窗口,UWP应用程序生命周期仍然认为您的应用程序正在前台运行

真正酷的是,当你的应用程序回到前台或被减到最小时,RequestActive()调用将自动被重新激活。你什么都不用做

这也意味着,如果另一个应用程序碰巧发出保持屏幕活动的请求,它就不能劫持同一设备上其他所有应用程序的行为。只有用户使用该应用程序时,请求才有效。一旦应用程序被关闭或最小化,即使应用程序忘记调用RequestRelease(),Windows 10也会恢复正常的节能习惯

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


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

多亏了两位回答者——我实际上注意到窗口上有一个激活的事件,但我没有考虑到我也可以使用它来检查应用程序何时被停用。。。当你知道的时候很容易!不幸的是,似乎有一个边缘的情况下,它不工作。如果用户在应用程序打开且处于活动状态时将其设备置于睡眠状态,即按下电源按钮,则窗口会发出其已被停用的信号,但不会在设备再次启动时指示其已被重新激活,即使它当前是活动窗口:(太棒了——这很有道理;如果我以前在查看文档时,文档中提到了这一点就好了!谢谢!