前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >win10 uwp 获得焦点改变 如何判断应用是否获得焦点

win10 uwp 获得焦点改变 如何判断应用是否获得焦点

作者头像
林德熙
发布2018-09-18 16:50:00
1.9K0
发布2018-09-18 16:50:00
举报
文章被收录于专栏:林德熙的博客林德熙的博客

本文讲的是当我们应用失去焦点时,我们获得事件,当我们应用获得焦点,同样获得事件。同时,在应用不可以见时,我们也可以获得。

这里写图片描述
这里写图片描述

上面一张图,开始是应用启动,获得焦点,应用显示。然后我们打开另一个应用,切换,这时我们应用没有焦点。

然后我们用鼠标点击应用,我们应用获得焦点,这时显示鼠标点击获得焦点。

我们使用Alt+tab,切换出去别的软件,然后使用Alt+tab切换回,可以看到获得焦点。

然后点击任务栏,把应用最小化,这时我们的应用不显示,因为点开他就显示,我就使用字符串+这样我们的应用就可以获得失去焦点和从哪获得焦点、应用不显示。

我们应用有两个事件,一个是Window.Current.Activated一个Window.Current.VisibilityChanged,我们可以通过Window.Current.Activated来知道,我们的应用得到焦点。

UWP应用获得焦点可以使用Window.Current.Activated,事件参数有几个,WindowActivatedEventArgs eCoreWindowActivationState

  • CodeActivated 从操作系统拿到焦点,这个就是我们使用Alt+tab,不是鼠标点击的获得焦点。我们这里,用鼠标点击任务栏打开应用,是操作系统给应用焦点。
  • PointerActivated 鼠标点击获得焦点,用鼠标点击应用。
  • Deactivated 没有焦点。

我用简单的字符串绑定到View,我们可以看到,我们应用失去焦点和获得焦点。

代码语言:javascript
复制
        private void Current_Activated(object sender, WindowActivatedEventArgs e)
        {
            if (e.WindowActivationState == CoreWindowActivationState.CodeActivated)
            {
                ActivateReminder = "获得焦点\r\n";
            }
            else if (e.WindowActivationState == CoreWindowActivationState.PointerActivated)
            {
                ActivateReminder = "鼠标点获得\r\n";
            }
            else if (e.WindowActivationState == CoreWindowActivationState.Deactivated)
            {
                ActivateReminder = "没焦点\r\n";
            }
        }

我们可以用Window.Current.VisibilityChanged获得我们应用显示,参数VisibilityChangedEventArgs e如果e.Visible==true就是显示。

我们把应用最小化,应用就会不显示。

参见:http://grogansoft.com/blog/?p=1269

如何判断应用是否获得焦点

有时候需要判断应用是否获得焦点,我的图床软件判断当前应用有焦点就自动复制。

但是不可以通过 Window.Current.CoreWindow.Visible 判断窗口是否获得焦点,这个值判断是窗口是否最小或,在手机可以使用这个,但是在pc不可以,因为可能我是打开其他的软件。

为了在UWP 判断窗口是否获得焦点,简单的方法是使用上面的代码在失去焦点获得,从而设置一个本地值,让他知道是否获得焦点。

代码语言:javascript
复制
         private void Current_Activated(object sender, WindowActivatedEventArgs e)
        {
            _visibility = e.WindowActivationState != CoreWindowActivationState.Deactivated;
        }


         private bool _visibility = true;

但是还需要加上 当窗口的可见变化时的

代码语言:javascript
复制
                Window.Current.VisibilityChanged += Current_VisibilityChanged;
        private void Current_VisibilityChanged(object sender, VisibilityChangedEventArgs e)
        {
            _visibility = e.Visible;
        }

如果是在一个页面或一个控件使用上面的代码,注意,因为函数被加到一个静态的值,所以这个控件或page不会被释放,因为一直有引用。 如果经常进行导航,而且都是新建页面,那么会创建很多页面。

这些页面不会释放,于是内存占用越来越大,所以需要进行释放,方法是在视觉树取消时,从静态值删除函数。

代码语言:javascript
复制
         private void Unloaded(object sender, RoutedEventArgs e)
        {
            Window.Current.VisibilityChanged -= Current_VisibilityChanged;
            Window.Current.Activated -= Current_Activated;
        }

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何判断应用是否获得焦点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档