Перехват сообщения 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: