参考资料:
http://topic.csdn.net/u/20100609/15/845468df-d0a6-4938-bef3-75f086c9319d.html
http://topic.csdn.net/u/20100803/16/584eacc7-7440-4cf4-af4b-ec037cf41f36.html
http://topic.csdn.net/u/20100426/14/1f2260b7-de6e-4615-9367-79139798325f.html
///WinCE下实现唤醒屏幕背光时忽略第一次触摸和按键输入
http://hi.baidu.com/lvoids/item/f91ab9cb7752cd0c0ad93ad5
/背光驱动分析//
http://cky0612.blog.163.com/blog/static/2747891620117602421813
电源管理1/
http://blog.mcuol.com/User/iwillbeback008/Article/11150_1.htm
无论我在控制面板->显示中设置多长时间,最终PM->PDD中读取的都是ACUserIdle
代码如下:
dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szPath, 0, 0, &hk);
if(dwStatus == ERROR_SUCCESS)
{
// read system power state timeouts
gdwACTimeoutToUserIdle = RegReadStateTimeout(hk, _T("ACUserIdle"), DEF_TIMEOUTTOUSERIDLE);
gdwACTimeoutToSystemIdle = RegReadStateTimeout(hk, _T("ACSystemIdle"), DEF_TIMEOUTTOSYSTEMIDLE);
gdwACTimeoutToSuspend = RegReadStateTimeout(hk, _T("ACSuspend"), DEF_TIMEOUTTOSUSPEND);
gdwBattTimeoutToUserIdle = RegReadStateTimeout(hk, _T("BattUserIdle"), DEF_TIMEOUTTOUSERIDLE);
gdwBattTimeoutToSystemIdle = RegReadStateTimeout(hk, _T("BattSystemIdle"), DEF_TIMEOUTTOSYSTEMIDLE);
gdwBattTimeoutToSuspend = RegReadStateTimeout(hk, _T("BattSuspend"), DEF_TIMEOUTTOSUSPEND);
// release resources
RegCloseKey(hk);
}
请问:如果我想通过设置控制面板->显示的超时时间将背光关掉,请问我是否需要修改PM相关代码
解决办法是:在bkldrvmain.cpp监控线程函数中:
WORD fnBackLightThread(PVOID pvArgument)
我们可以找到:
while(1)
{
dwResult = WaitForMultipleObjects(BKL_NUM_EVENTS, &WaitEvents[0], FALSE, INFINITE);
……..
……..
While(1)死循环,不断检测各种和背光有关的各种状态,在看到死循环里面的WaitForMultipleObjects(BKL_NUM_EVENTS,&WaitEvents[0], FALSE, INFINITE);语句,调用了WaitForMultipleObjects多事件等待函数,但是却用了无限大的时间“INFINITE”作为等待时间,这显然没有把控制版面注册表中读回来的背光时间用上,所以做了一下改动:
//add by wxm
DWORD dwTimeoutGet;
//add by wxm
// add by wxm
dwTimeoutGet = GetTimeout(pBKLinfo)*1000;
dwResult = WaitForMultipleObjects(BKL_NUM_EVENTS, &WaitEvents[0], FALSE, dwTimeoutGet);
//add by wxm
把控制版面注册表中读回来的背光时间用上,同时在后面的switch(dwResult)中加入了:
case WAIT_TIMEOUT:
{
DEBUGMSG(1,(TEXT("WAIT_TIMEOUT \r\n")));
BackLightSetState(D4);
}
//add by wxm
break;
这样设置的背光时间到的时候,就可以进行背光的控制了。
在设定的时间 背光关闭后,唤醒不了?
解决办法:
、唤醒背光灯机制:(这里我是在Wince 6.0下改的)
(1) 背光控制当然要在用户有输入的时候把背光打开了,但是这个MDD中没有提到过这件事,我们只有自己加于一个进程来检测了。wince用户输入事件 ("PowerManager/ActivityTimer/UserActivity"),这个在楼上的几位都提到了;
首先我们在bkli.h 的BKL_MDD_INFO 结构体定义中加入输入事件的定义
//add by wxm
HANDLE hInputEvent; //输入触发事件
//add by wxm
在bkldrvapi.cpp 中加入:输入事件的赋值
//add by wxm
const TCHAR szevtUserInput[] = TEXT("PowerManager/ActivityTimer/UserActivity");
//add by wxm
创建事件:
//add by wxm
pBKLinfo->hInputEvent = CreateEvent(NULL, FALSE, FALSE, szevtUserInput);
if(NULL == pBKLinfo->hExitEvent)
{
RETAILMSG(ZONE_ERROR, (TEXT("BLK_Init:hInputEvent OpenDeviceKey failed with %u\r\n"), dwStatus));
goto error;
}
//add by wxm
在bkldrvmian.cpp中加入:
事件检测中的位置:
//add by wxm
#define BKL_EVENT_INPUT 4
//add by wxm
等待事件赋值:
//add by wxm
WaitEvents[BKL_EVENT_INPUT] = pBKLinfo->hInputEvent;
//add by wxm
输入事件的处理:
//add by wxm
case(WAIT_OBJECT_0 + BKL_EVENT_INPUT):
{
DEBUGMSG(ZONE_BACKLIGHT,(TEXT("BKL_EVENT_INPUT\r\n")));
BackLightSetState(D0);
}
break;
通过以上的修改就只要有输入事件比如触摸屏输入时就可以点亮背光灯了。
3。按键可以唤醒背光,但要按几次或者触摸几次屏才能唤醒背光?
目前的解决方式:
PowerManager/ActivityTimer/UserActivity等待的线程的优先级设置高点,基本是每次都能够捕捉到,大家可以试验下