开发者社区> 文艺小青年> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

在WM6应用层代码检测POWER键RESUME动作

简介:
+关注继续查看
今天有个客户在我的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
 11static BOOL g_bPowerEnd = FALSE;
 12static HANDLE g_hNoti = NULL;
 13static HANDLE g_hMsgQ = NULL;
 14static HANDLE g_hPowerThread = NULL;
 15
 16
 17DWORD WINAPI PowerThread(PVOID pParam)
 18{
 19    BYTE buf[QUEUE_SIZE];
 20    DWORD dwRead, dwFlag;
 21    
 22    DBGMSG(ZONE_LOG, (TEXT("++PowerThread\n")));
 23
 24    do
 25    {
 26        if( ReadMsgQueue(g_hMsgQ, &buf, QUEUE_SIZE, &dwRead, 10&dwFlag) )
 27        {
 28            POWER_BROADCAST* pBroad = (POWER_BROADCAST*)&buf;
 29
 30            if(pBroad->Message == PBT_RESUME)
 31            {
 32        DBGMSG(ZONE_LOG, (TEXT("PowerThread detected RESUME\n")));
 33
 34                //检测到POWER键按下,系统RESUME
 35                //TBD: 把RESUME时的处理写这儿
 36            }

 37        else if(pBroad->Message == EXIT_THREAD_MSG)
 38        {
 39                DBGMSG(ZONE_LOG, (TEXT("PowerThread deteced EXIT\n")));
 40        g_bPowerEnd = TRUE;
 41        break;
 42        }

 43        else
 44        {
 45        DBGMSG(ZONE_LOG, (TEXT("PowerNotify detected nothing\n")));
 46        }

 47        }

 48        
 49    }

 50    while(!g_bPowerEnd);
 51
 52    DBGMSG(ZONE_LOG, (TEXT("--PowerThread\n")));
 53
 54    return 1;
 55}

 56
 57BOOL InitPowerNotify()
 58{
 59    BOOL result = FALSE;
 60    MSGQUEUEOPTIONS options;
 61
 62    DBGMSG(ZONE_LOG, (TEXT("++InitPowerNofity\n")));
 63
 64    memset(&options, 0sizeof(options));
 65
 66    if(g_hPowerThread) //等待线程已经存在了,该模块已启动
 67    {
 68        result = TRUE;
 69        goto cleanup;
 70    }

 71    
 72    options.dwSize = sizeof(MSGQUEUEOPTIONS);
 73    options.dwFlags = MSGQUEUE_ALLOW_BROKEN;
 74    options.dwMaxMessages = QUEUE_ENTRIES;
 75    options.cbMaxMessage = sizeof(POWER_BROADCAST) + MAX_NAMELEN;
 76    options.bReadAccess = TRUE;
 77
 78    g_hMsgQ = CreateMsgQueue(MSGQ_NAME, &options);
 79
 80    if(!g_hMsgQ)
 81    {
 82        ASSERT(0);
 83        DBGMSG(ZONE_LOG, (TEXT("CreateMsgQueue for power notify failed\n")));
 84        goto cleanup;
 85    }

 86    else
 87    {
 88    DBGMSG(ZONE_LOG, (TEXT("CreateMsgQueue for power notify success\n")));
 89    }

 90
 91    g_hNoti = RequestPowerNotifications(g_hMsgQ, PBT_RESUME);
 92    
 93    if(!g_hNoti)
 94    {
 95        ASSERT(0);
 96        DBGMSG(ZONE_LOG, (TEXT("RequestPowerNotifications failed\n")));
 97        goto cleanup;
 98    }

 99    else
100    {
101    DBGMSG(ZONE_LOG, (TEXT("RequestPowerNotifications success\n")));
102    }

103
104    g_bPowerEnd = FALSE;
105    g_hPowerThread = CreateThread(NULL, 0, PowerThread, NULL, 0, NULL);
106    
107    if(!g_hPowerThread)
108    {
109        ASSERT(0);
110        DBGMSG(ZONE_LOG, (TEXT("CreateThread for PowerNotify failed\n")));
111        goto cleanup;
112    }

113
114cleanup:
115    DBGMSG(ZONE_LOG, (TEXT("--InitPowerNofity\n")));
116    return result;
117}

118
119BOOL EndPowerNotify()
120{
121    BOOL bRet = FALSE;
122    HANDLE hWriteMsgQ = NULL;
123    MSGQUEUEOPTIONS options;
124
125    DBGMSG(ZONE_LOG, (TEXT("++EndPowerNotify\n")));
126
127    if(!g_hPowerThread)
128    {
129        DBGMSG(ZONE_LOG, (TEXT("PowerThread has been exit\n")));
130    goto cleanup;
131    }

132    
133    memset(&options, 0sizeof(options));
134    
135    options.dwSize = sizeof(MSGQUEUEOPTIONS);
136    options.dwFlags = MSGQUEUE_ALLOW_BROKEN;
137    options.dwMaxMessages = QUEUE_ENTRIES;
138    options.cbMaxMessage = sizeof(POWER_BROADCAST) + MAX_NAMELEN;
139    options.bReadAccess = FALSE;
140    
141    hWriteMsgQ = CreateMsgQueue(MSGQ_NAME, &options);
142
143    if(hWriteMsgQ)
144    {
145        POWER_BROADCAST writebuf;
146        writebuf.Message = EXIT_THREAD_MSG;
147        if(FALSE == WriteMsgQueue(hWriteMsgQ, &writebuf, sizeof(writebuf), 10000) )
148        {
149            DBGMSG(ZONE_LOG, (TEXT("WriteMsgQueue failed\n")));
150        }

151        else
152        {
153            DBGMSG(ZONE_LOG, (TEXT("WriteMsgQueue succeed\n")));
154        }

155        
156        if(FALSE == CloseMsgQueue(hWriteMsgQ))
157        {
158            DBGMSG(ZONE_LOG, (TEXT("CloseMsgQueue failed\n")));
159        }

160    }

161    else
162    {
163    DBGMSG(ZONE_LOG, (TEXT("WriteMsgQ create failed\n")));
164    }

165    
166    DBGMSG(ZONE_LOG, (TEXT("Wait for PowerThread exit\n")));
167    
168    g_bPowerEnd = TRUE;
169    
170    if(    WaitForSingleObject(g_hPowerThread, 1000== WAIT_OBJECT_0 )
171    {
172    DBGMSG(ZONE_LOG, (TEXT("PowerThread exit success\n")));
173    g_hPowerThread = NULL;
174    bRet = TRUE;
175    }

176    else
177    {
178    DBGMSG(ZONE_LOG, (TEXT("PowerThread exit failed timeout\n")));
179    }

180
181cleanup:
182
183    if(g_hNoti)
184    {   
185        if( FALSE == StopPowerNotifications(g_hNoti) )
186        {
187            DBGMSG(ZONE_LOG, (TEXT("StopPowerNotifications failed, err = %d\n"), GetLastError()));
188        }

189        
190        g_hNoti = NULL;
191    }

192
193    if(g_hMsgQ)
194    {    
195    if(!CloseMsgQueue(g_hMsgQ))
196    {
197           DBGMSG(ZONE_LOG, (TEXT("CloseMsgQueue failed\n")));
198    }

199        
200    g_hMsgQ = NULL;
201    }

202
203    DBGMSG(ZONE_LOG, (TEXT("--EndPowerNotify\n")));
204    return bRet;
205}

206
复制代码
本文转自Walzer博客园博客,原文链接:http://www.cnblogs.com/walzer/archive/2008/07/18/1246251.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
独立按键控制LED亮灭及状态
独立按键控制LED亮灭及状态
0 0
【C#】解决MouseHook捕获鼠标动作,在有些电脑上SetWindowsHookEx失败返回0的问题
原文:【C#】解决MouseHook捕获鼠标动作,在有些电脑上SetWindowsHookEx失败返回0的问题 最近在debug鼠标位置捕获的功能时发现在其中的一台开发电脑上,SetWindowsHookEx一直返回0,导致Hook设置失败,有时候调成Release模式又是正常的。
914 0
如何解决在上层按键操作alsa code后无法调节驱动音量的原因
http://blog.csdn.net/morixinguan/article/details/56514356 之前写过一篇文章,是对alc5623.c codec部分进行了大致框架的分析,现在要解决一些实际问题,关于上层的代码我就不公布了,只公布在驱动的代码: 在手册中,我们看到一个这样的寄存器设置。
997 0
iOS让键盘消失,取消第一响应,取消一级响应
在开发中经常会遇到输入文本内容的时候,输入完毕的时候怎么让键盘消失的问题,有的是更改键盘的按键的方法,有的是点击屏幕的其他地方让键盘消失,个人更倾向于第二种,点击屏幕的其他地方让键盘消失,要实现这种方法其实很简单,在当前控制器的View添加一个点击手势,当触发这个手势时可以让特定的TextFiled的取消第一响应,也就是 [TextFiled resignFirstResponder]; 同样的还适合于很多的控件,还有一种更好的那就是让整个View上的所有控件都结束编辑,这样键盘就消失了。
535 0
iOS 消息(即方法调用)的两个隐藏参数 :self 和 _cmd
iOS 消息(即方法调用)的两个隐藏参数 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循“署名-非商业用途-保持一致”创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。
716 0
win7下不能收到窗口hook消息的问题
win7下由于UIPI的限制, 高权限进程无法收到底权限进程发来的消息, 因此对窗口消息hook时无法接收到消息,解决办法是在调用SetWindowsHookEx之前先调用ChangeWindowMessageFilterEx, 该函数修改指定窗口的UIPI消息过滤设置。
789 0
跟踪G-Sensor有时不起作用的问题
跟踪G-Sensor有时不起作用的问题        最近在生产反馈中,有提到批量机器中有大约2%的机器遇到不转屏的问题。笔者通过反复跟踪,重现了这个问题,通过分析lsmod,看到驱动又已经加载,但是就是不起作用,再通过getevent看信息,发现没有数据报上来,这说明有问题,G-sensor没有报数据肯定就不转屏了,那怎么解决呢?       仔细分析了G-sensor的驱动,流程上也没看出什么问题来,当然如果流程有问题就不可能是小概率出问题了, 那应该是大面积有问题了。
744 0
C# Process调用应用程序失败时应注意的问题
C#中如果采用Process调用应用程序失败,请添加下列第一行,设置应用程序所在的路径。                             Directory.SetCurrentDirectory([应用程序所在路径]);                    Process process = new Process();                    process.
786 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载