![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| vovams |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 28.6.2007 Репутация: нет Всего: нет |
Мне нужно выключить компьютер так, чтобы пользователь не смог отменить выключение, но и чтобы не потерять несохранённые данные.
Решил сделать так: выключить компьютер API функцией ExitWindowsEx(EWX_SHUTDOWN) (т.е. не завершать приложения, которые ответили отказом на WM_QUERYENDSESSION), если компьютер не выключится через 30 секунд, сгибернировать его (спящий режим с сохранением RAM на HDD). Теперь проблема. Если какое-то приложение имеет несохранённые данные, оно выдаёт запрос на сохранение. Если ничего не нажимать, то появится диалоговое окно снятия процесса (в Windows XP, по крайней мере). Если пользователь нажмёт "Отмена" в первом запросе, или "Отмена" или "Снять процесс" во втором запросе, то всё сработает. Но вот если пользователь просто проигнорирует предложение снять процесс, свернёт его и продолжит работать, то моя программа повиснет при попытки сгибернировать компьютер. Вот код функций выключения и гибернации (скачал из интернета):
Я так понимаю, что Windows не даёт инициировать новое завершение работы, пока активно старое. Если перед тем, как гибернировать, отменить выключение, то, наверное, должно сработать. Подскажите, как сделать? |
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 14 Всего: 58 |
vovams, данные нужно не потерять в сторонних приложениях?
P.S. Может проще дать пользователям время на сохранение, минуту например, а потом принудительно выключать компьютер? |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 21 Всего: 88 |
попробуй отправить всем WM_QUERYENDSESSION и проанализировать результат. Если кто-то отказался - в хибернейт
-------------------- Обижено школьников: 8 |
|||
|
||||
| vovams |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 28.6.2007 Репутация: нет Всего: нет |
Ну, да, нужно. Нет, так не подойдёт: можно не успеть или не заметить предупреждение. Последний раз, когда программа выдавала предупреждение за минуту, а затем выключала принудительно, одна программа как-раз сохраняла данные, когда компьютер выключился, и все данные были потеряны.
А если программа, получившая сигнал, выдаёт запрос на сохранение на экран и пользователь его проигнорирует, какой-то таймаут можно поставить? (И вообще, как это сделать?) |
|||
|
||||
| Keeper89 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: 14 Всего: 58 |
Как только пользователь отреагирует - гибернация. А таймер, думаю, можно поставить после получения положительного результата WM_QUERYENDSESSION. |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |