【WP 8.1开发】一键锁屏

在WP8的时候,关于如何关闭屏幕,国内外都有不少文章了,大家有兴趣地可以搜搜,很多,我就不给链接了,因为稍后我的例子中会有。

其实,关闭屏幕是调用了未开放的API,正因为这个API未开放的,不敢保证所有机型都能用。

这是一个Win32的API,用C语言写的,在托管代码中可以dll import,再调用,和在桌面的.NET程序的互操作是一样的。在WP 8中是要先创建一个Windows运行时组件项目,并在项目中dll import,然后在主项目中引用组件才能调用,前不久,我在MSDN的社区中看到有位仁兄说,在8.1上是不用建运行时组件的,你喜欢在哪引入dll函数都能调用。于是,昨晚我试了一下,果然,在8.1上是不用建Windows运行时组件项目就能调用。

不过,在新建项目时一定要选括号中有“Windows Phone”的模板,即移植的RT应用,不要选Silverlight的,记清楚了。

这个API函数叫Shell_TurnScreenOn,它有一个参数,bool类型,如果参数是true就是打开屏幕,false则是关闭屏幕。我们知道在手机上只要屏幕关了就会锁屏幕(默认),因此,只要调用Shell_TurnScreenOn(false)就可以达到一键锁屏幕的效果。

为了方便操作,我封装了一个类:

    public static class LockScreen
    {
        [DllImport("ShellChromeAPI.dll")]
        static extern void Shell_TurnScreenOn ( bool value );

        public static void TurnOffScreen ()
        {
            Shell_TurnScreenOn(false);
        }

        public static void TurnOnScreen ()
        {
            //Shell_TurnScreenOn(true);
            throw new NotImplementedException("暂时不实现。");
        }
    }

TurnOnScreen是打开屏幕,这里用不上,所以我让它抛了异常,一键锁屏,调用TurnOffScreen方法就可以了。

好了,基本原理说完了,接下来就可以任意发挥了。本文中,我给大家准备了两个示例,一柔一刚。柔者,有界面有按钮,可以创建辅助磁贴来一键锁屏;刚者,非常狠,无界面无初始屏幕,只要一启动就关闭屏幕。很简单,就是调用上面那个TurnOffScreen方法即可。

两个示例是差不多的,我先说柔的。单击按钮后锁屏。

        private void OnLock ( object sender, RoutedEventArgs e )
        {
            LockScreen.TurnOffScreen();
            if (this.ckbExit.IsChecked == true)
            {
                App.Current.Exit();
            }
        }

这里用到Application类的一个Exit方法,如果想在锁屏后退出程序,可以调用它,调用后程序就会退出。

接着是为一键锁屏创建辅助磁贴的代码。

        private async void OnPin ( object sender, RoutedEventArgs e )
        {
            if (!SecondaryTile.Exists(TILE_ID))
            {
                SecondaryTile t = new SecondaryTile(TILE_ID);
                t.VisualElements.Square150x150Logo = new Uri("ms-appx:///Assets/Logo.png", UriKind.Absolute);
                t.DisplayName = "一键锁屏";
                t.Arguments = "lock";
                t.VisualElements.ShowNameOnSquare150x150Logo = true;
                await t.RequestCreateAsync();
            }
            else
            {
                var tiles = await SecondaryTile.FindAllAsync();
                if (tiles.Count > 0)
                {
                    SecondaryTile theTile = tiles.FirstOrDefault(st => st.TileId == TILE_ID);
                    if (theTile != null)
                    {
                        await theTile.RequestDeleteAsync();
                    }
                }
            }
            UpdatePinButton();
        }

这个我不详说了,就是通过SecondaryTile类来创建或删除辅助磁贴,要注意的是必须为Arguments属性赋值,不然没法创建磁帖,而且不能为null,如果没有参数就用空字符串(""),我这里用了个参数lock。还有一点就是磁贴的ID必须唯一,这个就不用解释了,用脚丫子就能想明白的事。

当用户点击辅助磁贴启动应用程序,会进入OnLaunch方法,此时一定要先作判断再决定是否锁屏。为啥呢? 别忘了,用户从应用列表中启动应用程序时也会进入OnLaunch方法的,所以,要通过方法参数的磁贴ID和刚才创建辅助磁贴时赋值的Arguments来判断用户是不是通过辅助磁贴来启动程序的,如果是,不用显示界面,直接Lock屏,然后Exit。

        protected override void OnLaunched(LaunchActivatedEventArgs e)
        {

            // 如果是通过快捷磁贴启动的
            // 则先关闭屏幕,再退出应用程序
            if (e.TileId == MainPage.TILE_ID && e.Arguments == "lock")
            {
                LockScreen.TurnOffScreen();
                this.Exit();
            }

      ……

如何? 上面那个太柔了,没事,下面咱们来个更猛的,连界面都没有的,一启动就Lock。

在创建项目后,直接把项目生成的App.xaml、MainPage.xaml都X掉,都说没有界面了嘛,所以页面也不用了。

然后自己新建一个类,同样名为App,从Application类派生,注意必须有这个类,不然没法运行。并且,这个类的名字必须与清单文件中“入口点”中配置的名字相匹配,否则你等着倒霉吧。

App类的代码如下:

    public sealed class App : Application
    {
        public App ()
        {
            // 先关屏幕再退出
            LockScreen.TurnOffScreen();
            Exit();
        }
    }

还是那个思路,先Lock后退出。

各位要严重注意,光是完成以上动作,程序也是无法运行的,其实app是有Main入口点的,和一般的.net程序一样,但通常这个Main是由VS自动生成的,我们很少招惹它,因为你招惹也没用,重新生成应用程序后,这些由VS生成的文件会被覆盖,你修改了等于没改。但是,本例不一样,上面的步骤已经把项目模板生成的App.xaml干掉了,这个App类是我自己写的,因此在没有App.xaml文件的条件下VS是不会自动生成Main的,所以必须自己手动来创建一个Main方法。

    /// <summary>
    /// 必须通过此类声明Main,否则不能运行
    /// </summary>
    public static class AppStart
    {
        public static void Main ( string[] args )
        {
            Application.Start(ps => new App());
        }
    }

最后,打开清单文件,切换到所有可见资产选项卡,把初始屏幕的图片清除,程序都没有界面了,初始屏幕也是多余的,但是磁贴还是要的。

好了,这两个示例的源码我已上传,下载地址:http://files.cnblogs.com/tcjiaan/onekeyLockscreenApps.zip

时间不早了,88。

时间: 2024-08-25 19:04:15

【WP 8.1开发】一键锁屏的相关文章

Android简易实战教程--第六话《开发一键锁屏应用2&#183;完成》

转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/51885687点击打开链接 上一篇,初步开发了这个应用,功能都有了(见http://blog.csdn.net/qq_32059827/article/details/51860900 点击打开链接 ).但是遗留了两个问题.1.还是无法卸载:2.必须手动去点击应用程序进入程序,再点击按钮,这显得很麻烦. 这一篇就解决上面两个问题,做出最好的效果. 首先解决无法卸载问题: 在清单文件

Android简易实战教程--第五话《开发一键锁屏应用》

转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/51860900 点击打开链接 Device Administration 对于这个应用,市场上很多,但是看一下评论就知道效果有多差了,因为99%一键锁屏应用没办法卸载.今天就开发一个小应用,实现轻松点击一键锁屏,同时支持卸载... 通查看谷歌原文档,有设备管理器的API,从这里可以抽取一些代码,开发出一个小应用,即即将介绍的<一键锁屏>. 根据文档翻译,获取设备管理器的大致步骤如

Android一键锁屏源码

APK下载 源程序下载 锁屏流程如下(参考于Android一键锁屏开发全过程[源码][附图]) 源码参考于一键锁屏 源码 一共有2个Java文件: 1 package com.example.onekeylock.app; 2 3 import android.app.admin.DeviceAdminReceiver; 4 5 public class AdminReceiver extends DeviceAdminReceiver{} AdminReceiver.java 1 packag

一键锁屏

设备策略服务   DevicePolicyManager 要配置特殊的广播接受者 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height=&

160824华为Mate7创建一键锁屏快捷方式

通过电源键锁屏,易导致按键损坏,而下拉栏,又不方便,下第三方程序又过于小题大做,其实,EMUI中是有一键锁屏软件的,可通过ROOT后CUST分区的XML显示隐藏的程序,这里介绍直接调用程序中的子功能,可扩展调WIFI面板,USB设置. 下载软件: QuickShortcutMaker(创建捷径).apk    地址:http://down.51cto.com/data/2236978 按住桌面空白区域切换到添加软件状态 选择下方的"窗体小工具",向右浏览到黄色此样图标,并按住此图标拖动到桌面空余

android一键锁屏

原文地址:http://www.fengfly.com/plus/view-209437-1.html 要用到下面两个类: DeviceAdminReceiver 设备管理组件.这个类提供了一个方便解释由系统发出的意图的动作.你的设备管理应用程序必须包含一个DeviceAdminReceiver的子类.本程序中,就代表一个手机上的设备管理器. DevicePolicyManager 一个管理设备上规范的类. 大多数客户端必须声明一个用户当前已经启用的DeviceAdminReceiver. 这个

Android4.0+锁屏程序开发——设置锁屏页面篇

[如何开发一个锁屏应用] 想要开发一个锁屏应用,似乎很难,其实并没有想象中那么难. 从本质上来说,锁屏界面也只是一个Activity而已,只是这个界面比较特殊,在我们点亮屏幕的时候,这个界面就会出现. 而且在此界面中,我们可以用一些行为来退出,比如点击按钮等. 还有一个特征是在这个界面的时候,我们通常是不能使用底部的三个按钮的 关于如果屏蔽底部的三个按钮,我已经在另一篇博客Android4.0+锁屏程序开发——按键屏蔽篇进行了总结,有需要的朋友可以参看. 这篇博客我们主要讨论如何让一个Activ

Android Device Administration 设备管理器——一键锁屏的实现

Android Device Administration 设备管理器--锁屏的实现 最近研究了一下安全这一块的内容,当然,我是比较水的,所以也拿不出什么好知识点,但是有一些冷门的东西我还是可以聊聊的,就拿这个锁屏来说吧,我们现在市面上有一些一键锁屏的软件 我们可以看到,是数不胜数的,所以,其实他一开始使用的时候,都需要请求设备管理器 我们可以看到,只有当我们激活的时候,我们才可以使用它,那么,他到底是什么东西呢?其实,当我们激活之后,我们可以在我们手机的设置--安全--设备管理器里面看到他的所

Android应用源码之一键锁屏

本项目是一个一键锁屏的小例子源码,安装以后会默认申请激活设备管理器,激活以后点击桌面图标即可实现一键锁屏,项目比较简单代码量也不多,想要学习锁屏或者设备管理器知识的朋友可以看一下,本项目默认编译版本4.4.2编码UTF-8 下载地址:http://www.devstore.cn/code/info/551.html 运行截图