今天有个客户在我的MOBILE手机上做开发,遇到个需要检测POWER键RESUME的问题. 他们直接说在应用层检测这个是不可能的.
那么我们就把不可能变成可能, 无非就是熟悉一下微软的游戏规则而已.
下面给出的代码,在整个程序开始时, 调用InitPowerNotify一下, 建立起MSG QUEUE和NOTIFY, 然后开个线程读MSG QUEUE等待RESUME触发. 如果等到RESUME事件, 则在PowerThread的TBD处加入处理代码, 如果程序结束, 那么调用一下EndPowerNotify, 把线程结束掉把HANDLE清理掉.
以下代码在WM6.1上验证过可用。里面我写了很多DBGMSG, 这个是我自己做的一个把LOG写到文件里的函数, 用户可以删掉. 由于程序去检测POWER RESUME, 之前一定会有一次POWER SLEEP, 那么USB线连着VS2005调试就断掉了,所以只能把LOG写到文件里来看,而无法单步调试或把LOG输出到VS2005的OUTPUT窗口.
最后我有个疑问, 在反初始化时, 我调用StopPowerNotifications结果返回值是FALSE, 代表该函数失败,但是立刻GetLastError得到的ERR号却也是0. 有没有高人能够解释一下?
1
#include <windows.h>
2
#include <pm.h>
3
#include <Msgqueue.h>
4
5
#define QUEUE_ENTRIES 3
6
#define MAX_NAMELEN 200
7
#define QUEUE_SIZE (QUEUE_ENTRIES * sizeof(POWER_BROADCAST) + MAX_NAMELEN)
8
#define MSGQ_NAME TEXT("PowerNotify")
9
#define EXIT_THREAD_MSG 0x12345678
10
11
static BOOL g_bPowerEnd = FALSE;
12
static HANDLE g_hNoti = NULL;
13
static HANDLE g_hMsgQ = NULL;
14
static HANDLE g_hPowerThread = NULL;
15
16
17
DWORD WINAPI PowerThread(PVOID pParam)
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18