Windows Mobile - 检测何时按下电源关闭按钮

时间:2010-02-25 20:29:11

标签: c# windows-mobile compact-framework

当用户按下Windows Mobile设备上的Power Off按钮时,是否有一种简单的方法可以获得通知?当然使用C#。

谢谢!

3 个答案:

答案 0 :(得分:3)

按下电源按钮后,电源管理器将发出状态更改通知。您可以通过致电RequestPowerNotifications请求PM向您发送通知您必须发送一个将获得通知的point-to-point messgae queue(托管版here)的句柄。

对于那些不想写下所有胶水来完成这项工作的人来说,所有这些都已经在SDF的PowerManagement class中预先完成了。

另外要预先警告,只是因为您要求通知意味着您的应用会在状态发生变化之前收到通知。例如,在下水道上,应用程序看不到通知是很常见的,并且几乎可以肯定,即使你确实看到它,你也没有时间执行任何事情,直到实际发生暂停。通常,您的处理程序将在设备恢复时运行(后跟任何恢复状态的处理程序)。

电源管理器不会等你,它只是广播一条消息。在关闭之前,不能使用它来运行代码。

答案 1 :(得分:1)

我只需将CreateMsgQueue()放入XIP RPM二进制文件中,无需源代码或OEM帮助。您需要使用十六进制编辑器和XDA论坛中的一些工具。

<DllImport("coredll.dll", SetLastError:=True)> _
Public Shared Function CreateMsgQueue(ByVal lpszName As String, ByVal lpOptions As MsgQueueOptions) As IntPtr
End Function

您也应该创建一个简单的驱动程序来阻止掉电事件,允许您的驱动程序在PowerDown设备事件中保持断电过程。通过这种方式,您可以获得有保证的事件,您可以设置标志并停止后台运行过程,并存储任何变量,然后在PowerUp事件中恢复它们,这也是winCE设备驱动程序的标准evc ++事件。真的很简单。互联网上有100多个演示源代码,我已在100多个网站上看到它。

答案 2 :(得分:0)

不幸的是,在我使用的Windows CE 6设备上,CoreDll中不存在CreateMsgQueue。还有其他建议吗?

我唯一能想到的就是不断根据设备的实时时钟检查Environment.TickCount。如果时间已经向前移动而不是滴答计数,那么可能是设备正在睡觉。

不喜欢这个解决方案,因为如果由于设备的实时时钟故障导致时间跳跃,它会被欺骗