接收屏幕保护程序通知

时间:2010-02-01 14:56:33

标签: windows winapi screensaver

我希望在屏幕保护程序即将启动时在我的C ++应用程序中收到通知。我尝试使用WM_SYSCOMMAND some people think should do the trick收听wParam == SC_SCREENSAVE条消息。 那没用。间谍++甚至表明我的窗口没有收到任何WM_SYSCOMMAND消息。有趣的是,当我关闭显示器时,我确实收到了wParam == SC_MONITORPOWER的消息。我理解错了吗?或者我错过了什么?

编辑:为了测试,我使用了默认的Windows屏幕保护程序(带有windows徽标的屏幕保护程序)。

3 个答案:

答案 0 :(得分:1)

看来只有在我的窗口有焦点时才会收到SC_SCREENSAVE消息。解决这个问题的方法是设置global hook。这需要我put the callback function in a separate DLL并且还有一个关于钩子减慢系统速度的可怕消息,因此我决定放弃响应屏幕保护程序启动的想法。

答案 1 :(得分:0)

这是一项相对复杂的任务(尽管如果这很容易就会很好)。

如果您的窗口是焦点,那么您在网上找到的某些测试只会起作用。如果它在后台运行,它可能不会收到此类消息。

其他测试依赖于运行的屏幕保护程序(检查当前设置的屏幕保护程序,然后查看进程列表以查看它是否处于活动状态)但是如果进入节拍模式或屏幕保护程序是黑屏则不起作用(即,没有程序,只是关闭监视器。)

我不相信有一种理想的方法可以做到这一点。您可能希望回到起点并更仔细地考虑为什么需要检测此状态,以及您要完成的任务。您可能需要一个不同的解决方案。

答案 2 :(得分:0)

可能我的答案来得太晚了。

MSDN处理" Legacy"下的屏幕保护程序。 在笔记本电脑上他们浪费电池,在PC上他们也没用。 最好关闭显示器,而不是让它显示屏幕保护程序。

由于您没有准确解释您想要做什么,因此我不知道您是否确实需要在保护程序启动之前发出通知,或者它是否足以在刚刚启动时收到通知。< / p>

在后一种情况下很容易。 写一个定期检查的线程:

    BOOL b_SaverRunning;
    SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &b_SaverRunning, 0);