在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 > )
{
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。

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

  1. Android简易实战教程--第六话《开发一键锁屏应用2·完成》

    转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/51885687点击打开链接 上一篇,初步开发了这个应用,功能都有了(见http:// ...

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

    转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/51860900 点击打开链接 Device Administration 对于这个应 ...

  3. Android一键锁屏源码

    APK下载 源程序下载 锁屏流程如下(参考于Android一键锁屏开发全过程[源码][附图]) 源码参考于一键锁屏 源码 一共有2个Java文件: package com.example.onekey ...

  4. android DevicePolicyManager实现一键锁屏

    本文章一部分资料来源于网上 1.实现一键锁屏关键是DevicePolicyManager这个类,然后使用lockNow():方法. 2.DevicePolicyManager类,可以让你的做软件获得系 ...

  5. XC一键锁屏应用

    XC一键锁屏,一键Android锁屏应用,彻底解放开关机键~ 下载地址: http://download.csdn.net/detail/jczmdeveloper/7329447

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

    Android Device Administration 设备管理器--实现一键锁屏 最近研究了一下安全这一块的内容,当然,我是比较水的,所以也拿不出什么好知识点,但是有一些冷门的东西我还是可以聊聊 ...

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

    [如何开发一个锁屏应用] 想要开发一个锁屏应用,似乎很难,其实并没有想象中那么难. 从本质上来说,锁屏界面也只是一个Activity而已,只是这个界面比较特殊,在我们点亮屏幕的时候,这个界面就会出现. ...

  8. Android一键锁屏APP

    题记: 这个app完全是拾人牙慧,作为练手用的,其实没有什么原创的东西.当然,博客还是我自己写的,记录下来,对自己也算是一种成长吧. 转载请注明原文地址: http://www.cnblogs.com ...

  9. Android平台一些流行的使用3D技术开发的锁屏

    题外话:从2007年android系统的发布开始,到2008年的第一款手机问世,再到现在击败塞班,wm,黑霉,然后遍地开花,2013年,智能机出货超过了功能机,android功不可没.一路走来,虽然a ...

随机推荐

  1. python基础整理笔记(八)

    一. python反射的方式来调用方法属性 反射主要指的就是hasattr.getattr.setattr.delattr这四个函数,作用分别是检查是否含有某成员.获取成员.设置成员.删除成员. 此外 ...

  2. 『TCP/IP详解——卷一:协议』读书笔记——14

    2013-08-25 11:32:06 第5章 RARP:逆地址解析协议 5.1 引言 具有本地磁盘的系统引导时,一般是从磁盘上的配置文件中读取IP地址.但是无盘机,如X终端或无盘工作站,则需要采用其 ...

  3. jqm页面跳转问题

    jqm里面页面跳转默认都是通过ajax请求的,必须重新刷新页面js方可有效,也就是js没有起作用,并不是js本身的问题,下面说说解决方法: 在使用jQuery Mobile进行Web开发中,当页面跳转 ...

  4. 创建webservice实例

    http://blog.csdn.net/haiyanstudent/article/details/32148207

  5. 强类型DataSet的使用简明教程

    关于弱类型 DataSet的缺点: 无论何时从 DataSet检索值都是以Object类型返回,需要对它进行类型转换: 给其它开发者使用 时无法知道哪些列可用: 运行时才能知道所 有列名,数据绑定麻烦 ...

  6. python string intern

    python  字符串是不可变的. 字符串pool会对 t "looklike" Python identifiers 字符串做intern缓存.

  7. java程序员的技能要求

    一.WEB编程1.客户端WEB编程a) 知道html和xhtml的区别b) 熟悉框模型(盒子模型)概念,了解margin.border.padding的区别c) 熟悉浮动.定位的概念,了解positi ...

  8. PDO vs. MySQLi 选择哪一个?(PDO vs. MySQLi: Which Should You Use?)-转载

    用Php访问数据的时候,你选择MySQLi和PDO,在选择之前,你应该知道些什么呢? 这篇文章将会介绍这两种方式的不同点,数据库的支持.稳定性.性能等问题. 概述   PDO MySQLi Datab ...

  9. Mroonga 3.0.8 发布,MySQL 存储引擎

    Mroonga 3.0.8 支持 REPAIR TABLE 支持损坏的 groonga 数据库. Mroonga 是一个 MySQL 存储引擎,基于 Groonga,提供完整的全文搜索引擎.

  10. Visual Studio 2015 RC版官方下载(ISO)

    微软Build2015开发者大会发布了下代开发套件Visual Studio 2015 RC候选版,覆盖企业版.专业版以及免费授权的Community社区版,原生支持开发通用型Windows Apps ...