如何判断UWP应用是否具有焦点

桌面版本Windows中,一个UWP应用只有在被最小化的时候才会引发Suspending事件,在使用了扩展执行(Extended Execution)(参见使用扩展执行最小化运行)的情况下,更是不知什么时候才会引发Suspending事件了。手机系统中,Suspending同样不能代表应用不具有焦点。所以,使用Suspending和Resuming事件判断应用是否具有焦点是不可行的。


正确答案是使用Activated事件。UWP应用在获得或者失去焦点时会引发Activated事件。“失去焦点”包括“用户点击了屏幕上的另一个窗口”以及“通过Alt+Tab切换应用”等,“得到焦点”包括“用户点击了当前窗口”以及“用户通过Alt+Tab切换到当前窗口”等。总之,Activated事件在窗口从活动窗口变成非活动窗口的时候或者反过来的时候引发。

使用一个布尔类型的变量,在Activated事件引发时记录当前状态,即可实现判断应用是否具有焦点。在应用有焦点的情况下,应当停止向通知中心发送消息并从通知中心中清除已读的消息。

要捕获Activated事件,首先在Apps.xaml.cs中通过如下代码来绑定Activated事件:

protected override void OnWindowCreated(WindowCreatedEventArgs args)
{
    args.Window.Activated += Window_Activated;
    base.OnWindowCreated(args);
}

因为用户每次点击开始菜单中的应用图表时都会执行OnLaunched函数,如果你的应用支持打开文件的话,还有可能只执行OnFileActivated函数而不执行OnLaunched函数。所以对于只有一个窗口的应用来说,应当在OnWindowCreated函数中绑定该事件。(注意:共享界面、文件选取器界面等都是窗口,所以一定要搞清楚应用是不是单窗口应用——通常来说,用户在使用应用的共享界面时并不希望错过通知。)

然后在Window_Activated执行适当的逻辑:

private void Window_Activated(object sender, WindowActivatedEventArgs e)
{
    if (e.WindowActivationState == CoreWindowActivationState.Deactivated)
    {
        // 窗口失去焦点时,启用通知功能。
        toastNotificationsEnabled = true;
    }
    else
    {
        // 窗口获得焦点时,禁用通知功能。
        toastNotificationsEnabled = false;
    }
}

留言

有想法?请给我们留言!您的留言不会直接显示在网站内。