Получите уведомление заставки - PullRequest
1 голос
/ 01 февраля 2010

Я хочу получать уведомление в своем приложении C ++, когда заставка собирается запуститься. Я попытался прослушать WM_SYSCOMMAND сообщения с wParam == SC_SCREENSAVE, которые , по мнению некоторых, должны помочь Это не сработало. Spy ++ даже показал, что мое окно не получило никакого сообщения WM_SYSCOMMAND. Интересно, что когда я выключил монитор, я получил сообщение с wParam == SC_MONITORPOWER. Я правильно понимаю? Или я просто что-то пропустил?

Редактировать: Для тестирования я использовал заставку Windows по умолчанию (с логотипом windows).

Ответы [ 3 ]

1 голос
/ 12 февраля 2010

Похоже, что я получу сообщение SC_SCREENSAVE, только когда мое окно будет в фокусе. Обойти это можно, установив global hook . Это потребовало бы от меня поместить функцию обратного вызова в отдельную DLL , и есть также это страшное сообщение о перехватах, замедляющих систему, поэтому я решил отказаться от идеи реагирования на запуск заставки.

0 голосов
/ 08 августа 2015

Возможно, мой ответ приходит слишком поздно.

MSDN обрабатывает заставки в разделе "Legacy". На ноутбуке они разряжают батарею, а на ПК они также бесполезны. Лучше выключить монитор, чем показывать заставку.

Поскольку вы точно не объясните, что именно вы хотите сделать, я не знаю, действительно ли вам нужно уведомление ДО того, как заставка запустится, или достаточно того, чтобы получить уведомление, когда оно уже только началось.

В последнем случае это просто. Напишите ветку, которая периодически проверяет:

    BOOL b_SaverRunning;
    SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, &b_SaverRunning, 0);
0 голосов
/ 01 февраля 2010

Это довольно сложная задача (хотя было бы неплохо, если бы это было легко).

Некоторые из этих тестов вы найдете в сети, только если ваше окно находится в фокусе. Если он работает в фоновом режиме, он может не получать такие сообщения.

Другие тесты основаны на работе программы-заставки (проверьте текущую установленную заставку, а затем просмотрите список процессов, чтобы увидеть, активна ли она), но не работают, если вы переходите в режим энергосбережения или если ваша заставка имеет черный экран (т.е. нет программы, просто монитор выключен).

Я не верю, что есть идеальный способ сделать это. Возможно, вы захотите вернуться к началу и более тщательно подумать о том, зачем вам нужно обнаруживать это состояние и что вы пытаетесь достичь. Вам может понадобиться другое решение.

...