【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 > )
{
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开发】一键锁屏的更多相关文章
- Android简易实战教程--第六话《开发一键锁屏应用2·完成》
转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/51885687点击打开链接 上一篇,初步开发了这个应用,功能都有了(见http:// ...
- Android简易实战教程--第五话《开发一键锁屏应用》
转载请注明出处:http://blog.csdn.net/qq_32059827/article/details/51860900 点击打开链接 Device Administration 对于这个应 ...
- Android一键锁屏源码
APK下载 源程序下载 锁屏流程如下(参考于Android一键锁屏开发全过程[源码][附图]) 源码参考于一键锁屏 源码 一共有2个Java文件: package com.example.onekey ...
- android DevicePolicyManager实现一键锁屏
本文章一部分资料来源于网上 1.实现一键锁屏关键是DevicePolicyManager这个类,然后使用lockNow():方法. 2.DevicePolicyManager类,可以让你的做软件获得系 ...
- XC一键锁屏应用
XC一键锁屏,一键Android锁屏应用,彻底解放开关机键~ 下载地址: http://download.csdn.net/detail/jczmdeveloper/7329447
- Android Device Administration 设备管理器——实现一键锁屏
Android Device Administration 设备管理器--实现一键锁屏 最近研究了一下安全这一块的内容,当然,我是比较水的,所以也拿不出什么好知识点,但是有一些冷门的东西我还是可以聊聊 ...
- Android4.0+锁屏程序开发——设置锁屏页面篇
[如何开发一个锁屏应用] 想要开发一个锁屏应用,似乎很难,其实并没有想象中那么难. 从本质上来说,锁屏界面也只是一个Activity而已,只是这个界面比较特殊,在我们点亮屏幕的时候,这个界面就会出现. ...
- Android一键锁屏APP
题记: 这个app完全是拾人牙慧,作为练手用的,其实没有什么原创的东西.当然,博客还是我自己写的,记录下来,对自己也算是一种成长吧. 转载请注明原文地址: http://www.cnblogs.com ...
- Android平台一些流行的使用3D技术开发的锁屏
题外话:从2007年android系统的发布开始,到2008年的第一款手机问世,再到现在击败塞班,wm,黑霉,然后遍地开花,2013年,智能机出货超过了功能机,android功不可没.一路走来,虽然a ...
随机推荐
- Object-C内存管理-对象引用计数的特例
看到OC中内存管理这块,其中的引用计数部分,部分10.5上的EBOOK示例已经在10.9上不能运行正确了,比如下面的代码: NSString * str1 = @"string 1" ...
- tail queue代码阅读
tail queue是bdb中用的最多的数据结构. 定义在 src/dbinc/queue.h: 注: TRACEBUF,QMD_TRACE_HEAD等是为了 queue代码的debug, 这里移除出 ...
- JavaWeb 命名规则
命名规范命名规范命名规范命名规范 本规范主要针对java开发制定的规范项目命名项目命名项目命名项目命名 项目创建,名称所有字母均小写,组合方式为:com.company.projectName.com ...
- Microsoft Visual Studio 2010 已安装的模板 没有 “ADO.NET实体数据模型”
2010 sp1才包括entity framework. 装一个补丁即可 地址为:http://www.microsoft.com/zh-CN/download/details.aspx?id=236 ...
- code review
代码审核,开发者代码完工,就可以下一个环节,即代码审核,通过代码审核,可以看到多个开发者的代码规范,隐藏的BUG,一些注释等规范. 通过代码审核,我们开发者可以互相学习,使得代码逻辑正确,重用
- Android ------ handler 异步处理消息
Handler基本概念: Handler主要用于异步消息的处理:当发出一个消息之后,首先进入一个消息队列,发送消息的函数即刻返回,而另外一个部分逐个的在消息队列中将消息取出,然后对消息进行出来,就是发 ...
- MFC学习随笔(2)
在MFC中,有时需要多个类之间传递信息,一个共通的头文件是个不错的选择.如果在头文件中直接声明一个变量的话,势必会报出一个错误: error LNK2005: "struct my_glob ...
- c#判断是否为合法的email地址
题目要求: class Program { static void Main(string[] args) { Console.WriteLine("请输入正确的邮箱地址,以 @sina.c ...
- nginx.conf配置(支持thinkphp)
error_log /home/wwwlogs/nginx_error.log crit; pid /usr/local/nginx/logs/nginx.pid; #Specifies the va ...
- crtmpserver系列(一):流媒体概述
概述 所谓流媒体按照字面意思理解就是像流一样的媒体,看起来像是废话.流媒体现在司空见惯,所以一般人大概不会有疑问.事实上在流媒体还没有出现的时候,基本上通过网络播放电影就不太现实.通过网络播放电影的时 ...