• 【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。

  • 相关阅读:
    用Live Writers发布Blog
    ScribeFire
    再再上传一个图片
    jQuery页面加载初始化常用的三种方法
    JS 20200101T00:00:00.000000Z 日期格式转换、Sun Jul 04 2021 00:00:00 GMT+0800 (中国标准时间)转20210704 00:00
    vue 组件传值 props $emit $event
    jquery或js如何判断一个层是显示还是隐藏
    js合并俩个数组的三种方法
    uniapp生命周期
    SVN版本冲突
  • 原文地址:https://www.cnblogs.com/tcjiaan/p/4018612.html
Copyright © 2020-2023  润新知