在 Windows XP 上监控显示器电源事件
Posted
技术标签:
【中文标题】在 Windows XP 上监控显示器电源事件【英文标题】:Monitoring display power events on Windows XP 【发布时间】:2012-03-10 23:04:30 【问题描述】:在 Windows 上,只有焦点应用程序通过 WM_SYSCOMMAND
消息接收显示电源事件(wParam
设置为 SC_MONITORPOWER
,lParam
表示新的电源状态)。
在 Windows Vista 及更高版本上,任何应用程序都可以通过调用RegisterPowerSettingNotification
函数,使用GUID_SESSION_DISPLAY_STATUS
GUID 来通知显示电源事件。
有没有办法在 Windows XP 上的应用程序级别(即不使用在内核模式下运行的代码)实现相同的结果?
【问题讨论】:
驱动程序收到电源事件通知。 @BenVoigt:我正在寻找更直接的应用程序级别... 【参考方案1】:您需要做的就是处理WM_SYSCOMMAND
。我能想到的选项:
为此使用SetWindowsHookEx
(使用WH_CBT
)。
将 DLL 注入到每个进程中,该 DLL 挂钩 CreateProcess 并将自身注入到所有未来的进程中,实质上是挂钩整个系统。上述 DLL 将子类化当前进程中的所有窗口,您可以从那里处理WM_SYSMESSAGE
。
【讨论】:
@Jonathan Lingle:WM_SYSMESSAGE
不存在。你的意思是WM_SYSCOMMAND
?
@Lorenzo:是的,那是一个错字。我的错。【参考方案2】:
你不能在你的 WindowProc 中处理 WM_POWERBROADCAST 消息,一旦收到,就调用 GetSystemPowerStatus 吗?
【讨论】:
不,WM_POWERBROADCAST 不通知显示电源事件(请参阅msdn.microsoft.com/en-us/library/windows/desktop/…) 我投了反对票,真的吗?你试过了吗?我搜索了适用于 XP 的替代品,并从这里得到了它:nxtbook.com/nxtbooks/cmp/msdnmag0707/index.php?startid=49 你肯定投了反对票。你的回答离题了,我也解释了原因:WM_POWERBROADCAST 不通知 display 电源事件。你甚至读过这个问题吗?我在之前的评论中为您提供的链接是什么?以上是关于在 Windows XP 上监控显示器电源事件的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows XP 中使用 C# 在登录屏幕上显示窗口