Как определить, выключается ли компьютер для сохранения сеанса

Я делаю RPG-игру с помощью C ++ / x86 asm. Мой вопрос связан с компонентом C ++. В C ++ / win32 как мне определить, выключается или выключается компьютер, или что-то еще, чтобы я мог сохранить игровой сеанс. В моей игре есть опция «сохранения», но если пользователь или другая программа решает выключить компьютер, как я могу обнаружить это с помощью какого-то API-хука, чтобы я мог мгновенно сохранить игровой сеанс в текстовый файл.

Теперь, пожалуйста, не предлагайте вариант создания потока для пассивного запуска, поскольку я хочу, чтобы размер файла был минимальным, поэтому, если вы можете предложить какой-то хук WM_, это было бы здорово. Я бы обратился к MSDN, но я не хочу часами искать в их каталоге WM.


person Community    schedule 20.07.2014    source источник
comment
@ DanielA.White Этого должно быть достаточно для того, кто хочет выполнить свою работу   -  person Alireza    schedule 21.07.2014
comment
Интересная особенность. Я не знаю игр, в которых это делается.   -  person Neil Kirk    schedule 21.07.2014
comment
@NeilKirk Думаю, после прочтения этого поста будущие разработчики начнут его представлять :) И Дэниел Уайт, спасибо за этот ответ.   -  person    schedule 21.07.2014
comment
возможный дубликат Как определить, закрывается ли Windows или перезапуск   -  person Peter O.    schedule 21.07.2014


Ответы (1)


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

В комментарии предлагается сообщение WM_QUERYENDSESSION. Это имеет немного другое значение: это дает приложениям возможность пожаловаться на завершение сеанса и дает пользователю возможность не выходить из системы / выключать систему. Судя по вашему вопросу, вы не собираетесь предотвращать подобные вещи, поэтому WM_ENDSESSION мне кажется более подходящим вариантом.

person Community    schedule 20.07.2014
comment
Возможно, будет разумно подготовить содержимое файла на WM_QUERYENDSESSION уже, поскольку завершение работы должно быть быстрым процессом. - person MSalters; 21.07.2014