Перехват сообщения WM_ENDSESSION

Можно ли перехватить сообщение WM_ENDSESSION, чтобы предотвратить его получение другим приложением?

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

Приложение является программным обеспечением для записи экрана, и оно просто выбрасывает видео, когда Windows выключается. Мне нужно предотвратить это и сохранить видео.

1 ответ

Можно ли перехватить сообщение WM_ENDSESSION, чтобы предотвратить его получение другим приложением?

Технически, да, используя перехват сообщений от SetWindowsHookEx(), В зависимости от используемого хука, вы можете иногда изменять (не отбрасывать) сообщения, чтобы они выглядели как другие сообщения, такие как WM_NULL, Тем не менее, в случае WM_ENDSESSIONЭто всего лишь уведомление, а не запрос, поэтому Windows по-прежнему будет продолжать закрываться независимо от того, что приложения делают с этим сообщением.

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

Приложение является программным обеспечением для записи экрана, и оно просто выбрасывает видео, когда Windows выключается. Мне нужно предотвратить это и сохранить видео.

Итак, вы на самом деле не хотите избегать WM_ENDSESSIONвы просто хотите отложить обработку другим приложением до тех пор, пока ваше действие не будет выполнено первым.

Лучшим вариантом будет просто связаться с автором рекордера и попросить добавить функцию, чтобы сохранить видео при выключении системы.

Помимо этого, MSDN говорит следующее:

Изменения завершения работы приложения в Windows Vista

По умолчанию приложения без видимых окон верхнего уровня получают 5 секунд для обработки WM_ENDSESSION до завершения.

Если вашему приложению может потребоваться более 5 секунд для завершения обработки завершения работы в ответ на WM_ENDSESSION, оно должно вызвать ShutdownBlockReasonCreate() в своем обработчике WM_QUERYENDSESSION и незамедлительно ответить TRUE на WM_QUERYENDSESSION, чтобы не блокировать завершение работы. Затем он должен выполнить всю обработку выключения в своем обработчике WM_ENDSESSION.

Таким образом, Windows будет обрабатывать ваше приложение так, как если бы оно имело видимые окна верхнего уровня, и предоставит ему 30 секунд для обработки WM_ENDSESSION.

Таким образом, вы можете попробовать использовать перехват сообщений для перехвата WM_QUERYENDSESSION и позвони ShutdownBlockReasonCreate() и сразу возвращайся, потом перехватывай WM_ENDSESSION вызвать действие сохранения видео и вызвать ShutdownBlockReasonDestroy() когда это закончено. Предполагая, конечно, что рекордер выбрасывает видео в ответ на WM_ENDSESSION и не WM_QUERYENDSESSION,

Посмотрите MSDN для получения дополнительной информации о том, как эти два сообщения обрабатываются Windows:

Изменения выключения для Windows Vista

Другие вопросы по тегам