1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 如何禁止或暂停Windows的自动屏保 休眠等节电模式

如何禁止或暂停Windows的自动屏保 休眠等节电模式

时间:2022-05-16 09:27:12

相关推荐

如何禁止或暂停Windows的自动屏保 休眠等节电模式

当我们的软件运行在某一状态时,此时在做一些重要的、我们关心的事情,我们不希望受到自动屏保和休眠的打扰,需要暂时将自动屏保和休眠禁止掉。就比如暴风影音,在播放视频时是禁止自动屏保和休眠的。那我们怎样将自动屏保、休眠等节电模式暂时禁止掉呢?

Windows在启动屏幕保护程序前会向当前激活的应用程序发WM_SYSCOMMAND消息,其中wParam参数指定了即将执行的系统命令类型,值SC_SCREENSAVE表明这个消息为屏幕保护启动,拦截这个消息并return即可阻止启动屏幕保护,而值SC_MONITORPOWER为显示器节电自动关闭的消息,同理可return。下面为程序开启后,阻止系统这两个动作的代码。

// 为相关窗口类添加WM_SYSCOMMAND消息的响应函数void CXXXXWnd::OnSysCommand(UINT nID, LPARAM lParam) {if (nID == SC_SCREENSAVE || nID == SC_MONITORPOWER) {return;}CWnd::OnSysCommand(nID, lParam);}

Windows在执行电源相关设置的事务时,会发送WM_POWERBROADCAST消息,我们可以截获到该消息,相关代码如下所示。其中wParam参数指定了即将执行的系统命令类型。值PBT_APMQUERYSUSPEND表明此时执行的是待机,休眠的请求,过滤掉这个消息,就可以阻止系统进入待机或休眠等模式。截获到该通知消息,直接返回BROADCAST_QUERY_DENY即可,

//为相关窗口类添加虚函数WindowProcLRESULT CXXXXWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam){if (message == WM_POWERBROADCAST && wParam == PBT_APMQUERYSUSPEND)={return BROADCAST_QUERY_DENY;}return CWnd::WindowProc(message, wParam, lParam);}

但是对于WM_POWERBROADCAST消息,在Win7/Win8中是不会在UAC控制下的程序中广播的,要收到该消息可以关闭UAC,或者manifest文件来提权。并且在Win7/Win8中,如果按上述方法收到WM_POWERBROADCAST消息,是截不到PBT_APMQUERYSUSPEND wParam值的,目前的办法是截获到WM_POWERBROADCAST消息就处理,不比对wParam参数值。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。