【WCE】显示器电源管理 (Standard Shell)

2025年GESP3月认证C++五级真题解析 小 A 有 2n 件物品,小 B 和小 C 想从小 A 手上买走这些物品。对于第 i 件物品,小 B 会以 bi 的价格购买,而小 C 会以 ci 的价格购买。对于所有测试点,保证 1 <= T <= 100, 2 <= g < p <= 10^9, g, p 为整数, p 为质数。对于所有测试点,保证 1 <= n <= 10^5, 0 <= bi, ci <= 10^9, bi, ci 为整数。对于另外 50 % 的测试点,保证 n <= 100000, 0 <= bi, ci <= 10^9。 阅读详情

在使用 Standard Shell 的情况下,出于节约用电和保护显示器的目的,我们需要在 User Idle 时进入显示器节电模式 (ScreenOff),在 User Active 时退出显示器节电模式 (ScreenOn)。

该项功能要依靠 Power Manager 和 GWES 来实现,具体为:

  • Power Manager 维护显示器电源状态,通过设备驱动控制显示器进入/退出节电模式。
  • GWES 监视用户输入事件 (User Active) 并通知 Power Manager。

由于不少 BSP 未提供任何设备驱动来管理显示器,故我们需自行实现显示器电源管理功能。

在 $(_WINCEROOT)/PUBLIC/COMMON/OAK/FILES/common.reg 中存在:

[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Power]
    "DisableGwesPowerOff"=dword:0
    "ScreenPowerOff"=DWORD:300

根据 "DisableGwesPowerOff" 的值,存在两种实现方式:

  • 当 "DisableGwesPowerOff"=dword:0,GWES 会发送 WM_POWERBROADCAST 消息给任务栏,具体可在 $(_WINCEROOT)/PUBLIC/SHELL/OAK/HPC/EXPLORER/TASKBAR/taskbar.cpp 中找到如下代码段:  
        case WM_POWERBROADCAST:
        {
            
const WCHAR g_MessengerWindowClass[] = L"MSGSBlObj";
            HWND hwndMessenger;

            hwndMessenger 
= FindWindow(g_MessengerWindowClass, NULL);
            
if (hwndMessenger)
            {
                
// Notify Messenger of idle state
                PostMessage(
                                FindWindow(g_MessengerWindowClass, NULL),
                                msg,
                                wParam,
                                lParam
);
            }
        }
            
// Place holder for real screen saver implementation
            switch(wParam)
            {
                
case PBT_APMUSERIDLE:
                    
// ScreenSaver start
                    RETAILMSG(TRUE, (L"Screen Saver Started. "));
                    
break;

                
// Screen saver app should be looking for this message
                case PBT_APMUSERACTIVE:
                    
// ScreenSaver end
                    RETAILMSG(TRUE, (L"Screen Saver Ended. "));
                    
break;
            }

            
break;

 该段代码在 User Idle 时,调试输出“屏保已启动”;在 User Active 时,调试输出“屏保已结束”。考虑到多数 BSP 支持 GETPOWERMANAGEMENT / SETPOWERMANAGEMENT escape function,调用 ExtEscape 函数就可进入/退出节电显示器模式,修改后的代码如下: 

                case PBT_APMUSERIDLE:
                    
// ScreenOff
                    SetScreenPower(FALSE);
                    
break;

                
case PBT_APMUSERACTIVE:
                    
// ScreenOn
                    SetScreenPower(TRUE);
                    
break;

其中,函数 SetScreenPower 的实现代码如下:

DWORD SetScreenPower(BOOL bScreenOn)
{
    HDC hDC(GetDC(NULL));
    
if (!hDC) return GetLastError();

    _ATLTRY
    {
        DWORD dwQuery(GETPOWERMANAGEMENT);
        
if (ExtEscape(hDC, QUERYESCSUPPORT, sizeof(DWORD), (LPCSTR)&dwQuery, 0, NULL) <= 0)
            AtlThrowLastWin32();

        VIDEO_POWER_MANAGEMENT power;
        power.Length 
= sizeof(power);
        
if (ExtEscape(hDC, GETPOWERMANAGEMENT, 0, 0, sizeof(power), (LPSTR)&power) != sizeof(power))
            AtlThrowLastWin32();

        power.PowerState 
= bScreenOn ? VideoPowerOn : VideoPowerOff;
        
if (ExtEscape(hDC, SETPOWERMANAGEMENT, sizeof(power), (LPSTR)&power, 0, NULL) <= 0)
            AtlThrowLastWin32();
    }
    _ATLCATCH(e)
    {
        ATLVERIFY(ReleaseDC(NULL, hDC));
        
return HRESULT_CODE((HRESULT)e);
    }

    ATLVERIFY(ReleaseDC(NULL, hDC);
    
return NO_ERROR;
}
  • 当 "DisableGwesPowerOff"=dword:1,这时 GWES 不会发送 WM_POWERBROADCAST 消息给任务栏了。那么我们需要通过调用 RequestPowerNotifications 函数要求 Power Manager 将电源通告写入指定的消息队列。
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    
// 消息队列参数
    MSGQUEUEOPTIONS qo;
    qo.dwSize 
= sizeof(MSGQUEUEOPTIONS);
    qo.dwFlags 
= MSGQUEUE_NOPRECOMMIT;
    qo.dwMaxMessages 
= 0;
    qo.cbMaxMessage 
= 256;
    qo.bReadAccess 
= TRUE;

    
// 创建消息队列
    CSafeHandle<HANDLE, CloseMsgQueue> hPowerNMsgQ(CreateMsgQueue(NULL, &qo));

    
// 请求电源通告
    CSafeHandle<HANDLE, (BOOL(__stdcall*)(HANDLE))StopPowerNotifications> hNotify(RequestPowerNotifications(hPowerNMsgQ, PBT_TRANSITION));  
 
    
while (TRUE)
    {
        
// 判断消息队列是否有数据写入
        if (WaitForSingleObject(hPowerNMsgQ, INFINITE) == WAIT_FAILED)
            
return GetLastError();

        
// 从消息队列读取数据
        BYTE buffer[256];
        DWORD cRead, dwFlags;   
        
if (!ReadMsgQueue(hPowerNMsgQ, buffer, sizeof(buffer), &cRead, INFINITE, &dwFlags))
            
return GetLastError();

        
// 根据 Power Manager 维护的显示器电源状态,进入/退出节电模式
        PPOWER_BROADCAST pPowerBroadcast((PPOWER_BROADCAST)buffer);
        
if (!_tcsicmp(pPowerBroadcast->SystemPowerState, TEXT("On")))
            SetScreenPower(TRUE);
        
else if (!_tcsicmp(pPowerBroadcast->SystemPowerState, TEXT("SystemIdle")))
            SetScreenPower(FALSE);
    }

    
return NO_ERROR;
}
Android面试指南及参考答案 【摘要】LesPark招聘Android开发工程师,要求3年以上经验,负责客户端功能开发与优化。岗位需掌握Java、多线程、网络编程(TCP/UDP/HTTP)及性能调试工具。面试重点考察:1)核心技术如网络协议选择(TCP可靠消息/UDP实时音视频)、内存泄漏分析;2)业务能力如图片懒加载三级缓存设计、启动速度优化案例;3)高阶系统原理如插件化框架设计;4)行为问题应对策略。建议候选人准备并发编程、JVM差异等深度知识,并量化项目优化成果,尤其关注社交应用相关的图片处理、实时通信等场景题。 阅读详情

相关推荐

电阻应变式力传感器

电阻应变式力传感器

lu_fresh_student的博客 5075

工作配的电脑配置

--------[ 鲁大师 ]---------------------------------------------------------------------------------- 软件: 鲁大师 6.1021.3205.1013 时间: 2021-10-18 16:59:33 软件: http://www.ludashi.com --------[ 概览 ]--------------------

一点痕迹 1932

Diebold-Mariano检验

给定两个预测的预测结果,我们希望比较他们的预测结果,以用于预测模型精度的比较。 Diebold-Mariano检验本质是一个t检验,用于检验替代预测的两个损失序列的平均值是否相等。即,它是一系列损失差的零均值的t检验。在存在自相关的情况下,它使用损失差分时间序列标准差的自相关一致性估计。 注意,在使用DM检验式时,假设损失序列是平稳的。 另外,DM检验在小样本数据时往往会拒绝零假设。对于小样本数据,推荐Harvey, Leybourne and Newbold (HLN)检验【1】; 参考文献 【1】htt

weixin_43948357的博客 6565

获取桌面DC: GetDC(GetDesktopWindow())与GetDC(NULL)

今天想获取桌面DC然后在上面作图, 结果不显示,巨郁闷: HDC hdc = GetDC(NULL); HWND hDeskWnd = GetDesktopWindow(); HDC hDeskDc = GetDC(hDeskWnd); TextOut(hDeskDc, 100, 10, _T("this is my test "), 15);...

weixin_34001430的博客 1970

量化投资从0开始系列 ---- 15. 郑商所日统计数据

前面已经提取了其它期货交易所的数据,最后还剩下郑商所。相比而言,郑商所的数据获取比其它几个交易所更麻烦一点。因为郑商所的系统接口有两个,在2015年11月11日前后发生了切换,这个日期之前是老系统的api接口,这个日期之后是一个新的api接口。 具体的地址在哪里,还是依靠在浏览器中按F12来确定,最后发现的地址是: if trade_date > '20151111': czce_url = f'http://www.czce.com.cn/cn/DFSS

kengxie的博客 2110

R语言pls包实战:手把手教你用偏最小二乘(PLS)搞定高维数据回归(附完整代码与数据标准化避坑指南)

本文详细介绍了如何使用R语言的pls包进行偏最小二乘(PLS)回归分析,特别针对高维数据回归问题。通过完整的代码示例和数据标准化避坑指南,帮助读者掌握从数据预处理到模型优化的全流程,解决实际应用中的常见问题。

weixin_42662605的博客 350

GetDC()

函数功能:该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图。 GetDCEx函数是GetDC的一个扩展,它能使应用程序更多地控制在客户区域内如何或是否发生剪切。 函数原型:HDC GetDC(HWND hWnd); 参数: hWnd:设备上下文环境被检索的窗口的句柄,如果该值为NULL,GetDC则检索整个屏幕的设

Andy20081251的专栏 2283

《揭秘 BME688人工智能压力湿度温度气体传感器:气体检测的多面能手》:此文为AI自动生成

BME688 是博世推出的一款具有人工智能和集成高线性度高精度压力、湿度、温度传感器的气体传感器,专为移动和联网应用开发,尺寸紧凑且低功耗。BME688 作为一款先进的传感器,在多个领域展现出卓越的性能。它采用了坚固而紧凑的 3.0 x 3.0 x 0.9 mm³ 封装,这种小巧的尺寸使其能够轻松应用于对空间要求严格的移动设备和联网应用中。同时,低功耗的特性也使得它在能源有限的环境下能够长时间稳定运行。

zheng_ruiguo的专栏 1927

GetDC 使用注意

或者,可以使用内存设备上下文(Memory Device Context)或缓存设备上下文(Cached Device Context),这些方式可以在内存中模拟设备上下文,从而避免直接访问实际的设备上下文。然而,需要注意的是,频繁地在不同的线程之间切换设备上下文可能会导致性能问题。在多线程应用程序中,如果需要在不同线程中使用设备上下文进行绘图操作,通常的做法是在每个线程中分别获取自己的设备上下文句柄。综上所述,方案二在资源管理方面是安全的,但方案一由于存在资源泄漏和程序无响应的问题,因此是不推荐的。

lijian2017的博客 1238

R语言分段回归

1.利用虚拟变量进行线性回归 (MEdata.csv的数据来源:https://github.com/ChenQihome9/优快云-Data-Library/blob/master/MEdata.csv) 问题13:针对TAX~GDP,使用分段回归方法,找到其回归方程。编程,并根据程序结果叙述如下几方面问题:(1)分几段最佳?(不超过5段内)(2)分段位置定在哪儿最佳?(3)写出最佳方...

ChenQihome9的博客 1万+

WSL 相关命令时遇到了 “无法从raw.githubusercontent.com提取分发列表、操作超时

核心问题:国内网络屏蔽raw.githubusercontent.com,导致WSL无法获取发行版列表;最优方案:优先用方案1(手动指定发行版安装),无需改配置,1分钟搞定;永久修复:用方案2(修改hosts),适合需要管理多个WSL发行版的场景;兜底方案:用方案3(手动下载安装包),适配所有网络环境。按以上步骤操作后,你不仅能正常安装WSL,等命令也能正常执行,后续可正常使用WSL搭配Docker Desktop(如切换WSL 2后端),无需再担心网络超时问题。

weixin_39766667的博客 2131

GetDC()函数

函数功能:该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图。   GetDCEx函数是GetDC的一个扩展,它能使应用程序更多地控制在客户区域内如何或是否发生剪切。   函数原型:HDC GetDC(HWND hWnd);   参数:   hWnd:设备上下文环境被检索的窗口的句柄,如果该值为NUL

行在路上 3万+

人工智能训练师(三级)操作技能考核·自测卷

为您定制了一份。这份试卷严格拆分了“业务分析”、“智能训练”、“智能系统设计”、“培训与指导”四大模块,所有填空题均来源于上一轮整理的。您可以先用它进行“第二步(抛开答案自己填)”,填完后对照末尾的答案速查进行“第一步(补全并运行)”的校验,最后标记错题进行“第三步(针对性重复练习)”。

suny8088的博客 103

第5章 绘图基础

1、GDI :Graphics Device Inter,图形设备接口。 2、GDI是通用接口,调用显示设备的驱动接口 3、GDI的主要目的就是支持与设备无关的图形;;位图有与设备有关位图和与设备无关位图。

一只奔跑的蚂蚁 327

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

GetDC() 特性

可以通过GetDC(NULL)得到整个窗口的DC,可以给整个窗口绘制图形

fysy0000的专栏 647

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

详细介绍GetDC(hwnd)

书籍:《(第五版)》环境:visual studio 2022内容:输出文字->在SYSMETS中加入卷动功能说明:以下内容大部分来自腾讯元宝是 Windows API 中用于获取设备上下文(Device Context, HDC)的核心函数,广泛应用于图形绘制和窗口管理。

felicity_one的博客 1477

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VC Skills 3

检查指定文件夹是否存在:PathIsDirectory()方法一:检查给定路径是否根目录:BOOL PathIsRoot(LPCTSTR pPath);说明:Returns TRUE for paths such as “/”, “ X:/”, “// server/ share”, or "// server/".Paths such as "../path2" will return FALS

FISH 的专栏 2544

Android基础——电源管理(Power Management)

文章目录电源管理待机组省电模式改进 电源管理 Android 9上引入了新特性,帮助改善设备电量管理。 电量管理新特性主要分为: 应用待机群组 系统基于用户使用方式的不同,限制APP对CPU或者电池的访问。这是Android 9新特性。 省电模式改进 当打开省电模式,系统对所有APP施加限制。这个特性在Android 9上得到了改进。 PS:这个改变是针对针对所有的APP,不管APP目标是否是Android 9. 待机组 5各群组: Active 用户正在使用的APP属于active群组,例如:

Zen@sz 博客 1902

总线中主动错误和被动错误的通俗解释

From https://wenku.baidu.com/view/738dfacdbb4cf7ec4afed0cd.html  首先建议把广泛使用的“主动错误”和“被动错误”概念换成“主动报错”和“被动报错”。 1. 主动报错站点     只要检查到错误,它立即“主动地”发出错标识。所谓“出错标识“,它本身就是一个“错误的位序列”(连续的6个显性位,不满足CAN协议的“最多5

业精于勤,荒于嬉;行成于思,毁于随 6664

显示器的关闭与打开编程

(1).SendMessage(Application->Handle,WM_SYSCOMMAND,SC_MONITORPOWER,1);//关闭显示器SendMessage(Application.Handle,WM_SYSCOMMAND,SC_MONITORPOWER,-1);//打开显示器SendMessage(hWnd, WM_SYSCOMMAND, SC_MONITORPOWER, 0)

Johnny的专栏 6258

翻译:Linux的电源管理架构

设备电源管理 Copyright (c) 2010 Rafael J. Wysocki, Novell Inc. Copyright (c) 2010 Alan Sternstern@rowland.harvard.edu   ************************************************************* 本文由DroidPhone翻译于201

DroidPhone的专栏 2万+

告诉你GetDC()没有释放造成的后果

最近做的项目中需要显示视频监控窗口,从采集卡中读到图像的数据,需要实时显示出来,而且速度比较快。 由于比较简单,就直接使用了GDI画图,以前复杂的都用openGL啥的工具了,这次这个简单,就直接用GDI了。 先获取DC,然后画图 pDC = this ->GetDC(); // 获得显示控件的 DC this->GetClientRect...

weixin_34202952的博客 924
上一篇: 【IDA】分析 Windows CE 事件日志服务(一)
下一篇: 【WCE】使用事件日志服务(四)
keyssoft
博客等级 码龄25年 8粉丝 35原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值