在 Windows XP 上监控显示器电源事件

Posted

技术标签:

【中文标题】在 Windows XP 上监控显示器电源事件【英文标题】:Monitoring display power events on Windows XP 【发布时间】:2012-03-10 23:04:30 【问题描述】:

在 Windows 上,只有焦点应用程序通过 WM_SYSCOMMAND 消息接收显示电源事件(wParam 设置为 SC_MONITORPOWERlParam 表示新的电源状态)。

在 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 上监控显示器电源事件的主要内容,如果未能解决你的问题,请参考以下文章

日语版xp系统

如何在 Windows XP 上获取已连接显示器的类型?

在 Windows XP 中使用 C# 在登录屏幕上显示窗口

xp系统重绘边框线不显示(首次加载没有触发paint事件)

在 Windows XP 中以编程方式旋转显示? (C++/Qt 和 WindowsAPI)

windows xp下如何监控windows服务的状态变化?