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

8
在Windows上,只有焦点应用程序通过WM_SYSCOMMAND消息(wParam设置为SC_MONITORPOWERlParam表示新的电源状态)接收显示电源事件。
在Windows Vista及更高版本中,通过调用RegisterPowerSettingNotification函数,并使用GUID_SESSION_DISPLAY_STATUS GUID,可以通知任何应用程序显示电源事件。
是否有一种方法在应用程序级别上在Windows XP上实现相同的结果(即不使用运行在内核模式下的代码)?

1
驱动程序收到电源事件的通知。 - Ben Voigt
@BenVoigt:我正在寻找更直接的东西,在应用程序级别上... - lornova
2个回答

2

您所需要做的就是处理WM_SYSCOMMAND。以下是我能想到的选项:

  • 使用SetWindowsHookEx(使用WH_CBT)。

  • 在每个进程中注入一个DLL,该DLL钩取CreateProcess并将自身注入所有未来的进程,从而钩取整个系统。然后,上述DLL将子类化当前进程中的所有窗口,您可以从那里处理WM_SYSMESSAGE


1
@Jonathan Lingle:WM_SYSMESSAGE 不存在。你是不是指的是 WM_SYSCOMMAND - lornova
@Lorenzo:是的,那是个打错字。我的错。 - user2058002

-1

你不能在你的WindowProc中处理WM_POWERBROADCAST消息,一旦收到该消息,调用GetSystemPowerStatus吗?


不,WM_POWERBROADCAST 不会通知显示器电源事件(请参见 http://msdn.microsoft.com/en-us/library/windows/desktop/aa373247(v=vs.85).aspx) - lornova
我被踩了一下,真的吗?你甚至试过吗?我在这里搜索了一个适用于XP的替代品:http://www.nxtbook.com/nxtbooks/cmp/msdnmag0707/index.php?startid=49 - Gunner
1
当然,你的回答被踩了。你的回答与主题不相关,我也已经解释过了:WM_POWERBROADCAST 不会通知显示器电源事件。你有没有读懂问题?还有我在之前评论中给你提供的链接? - lornova

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接