Запрос приостановить на Vista, но позволяют другим приложениям отменить - PullRequest
0 голосов
/ 26 августа 2009

Мое приложение использует Win32 SetSuspendState() API для запуска системы в режиме ожидания или гибернации, когда оно завершило выполнение длительной задачи.

API принимает параметр «ForceCritical», который определяет, будет ли система немедленно приостанавливаться или будет ли она сначала транслировать PBT_APMQUERYSUSPEND, чтобы другие приложения могли отменить приостановку. Мое приложение использует это для приятного воспроизведения с другими приложениями, такими как Media Player, поэтому оно не приостанавливается, если вы слушаете музыку или что-то еще.

По какой-то причине, начиная с Vista, MS изменила положение, поэтому этот параметр игнорируется , поэтому SetSuspendState немедленно вызывает приостановку, а другие приложения не имеют возможности ее остановить.

Кто-нибудь знает, как я могу вернуть желаемое "вежливое" поведение снова в Vista?

1 Ответ

1 голос
/ 27 августа 2009

MSDN говорит

Чтобы предотвратить переход системы в состояние низкого энергопотребления в Windows Vista, приложение должно вызвать SetThreadExecutionState, чтобы сообщить системе, что оно используется

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

...