1

当屏幕保护程序即将启动时,我想在我的 C++ 应用程序中收到通知。我试着听一些人认为应该起到作用的WM_SYSCOMMAND消息。那没有用。Spy++ 甚至显示我的窗口没有收到任何消息。有趣的是,当我关闭显示器时,我确实收到了消息。我理解错了吗?还是我只是错过了什么?wParam == SC_SCREENSAVEWM_SYSCOMMANDwParam == SC_MONITORPOWER

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

4

3 回答 3

1

似乎只有当我的窗口具有焦点时,我才会收到 SC_SCREENSAVE 消息。解决这个问题的方法是设置global hook。那将需要我将回调函数放在一个单独的 DLL 中,并且还有一条关于挂钩减慢系统速度的可怕消息,因此我决定放弃响应屏幕保护程序启动的想法。

于 2010-02-12T13:15:00.267 回答
0

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

您会发现其中一些在线测试仅在您的窗口处于焦点时才有效。如果它在后台运行,它可能不会收到此类消息。

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

我不相信有一个理想的方法来做到这一点。您可能想回到开始,更仔细地思考为什么需要检测这种状态,以及您要完成什么。您可能需要不同的解决方案。

于 2010-02-01T15:11:29.347 回答
0

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

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

由于您没有确切解释您想要做什么,我不知道您是否真的需要在保护程序启动之前收到通知,或者在它刚刚启动时是否足以收到通知。

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

    BOOL b_SaverRunning;
    SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &b_SaverRunning, 0);
于 2015-08-07T22:28:00.483 回答