Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2014, 20:40   #1
Janger
Форумчанин
 
Регистрация: 28.09.2011
Сообщений: 250
Вопрос Отменить или задержать выключение ПК

у меня не получается отменить выключение Windows.
Я нашёл код:
Код:
procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
if MessageDlg('Выключить Windows?',mtConfirmation,[mbYes,mbNo], 0) = mrNo then
begin
  Msg.Result := 0;
  sleep(5000);
end
else
begin
  Msg.Result := 1;
  sleep(5000);
end;
end;
Но к сожалению Msg.Result := 0; не приносит желаемого результата.
В интернете очень мало информации на эту тему....
--
Идея у меня в том, что бы задержать выключение Windows хотя бы на 1 минуту. Примерно...
Но в любом случае программа сама потом выключит ПК
Janger вне форума Ответить с цитированием
Старый 17.09.2014, 22:23   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Заменить Msg.Msg что-то там на WM_NULL и послать дальше по цепочке.
Человек_Борща вне форума Ответить с цитированием
Старый 18.09.2014, 02:06   #3
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от Janger Посмотреть сообщение
Идея у меня в том, что бы задержать выключение Windows хотя бы на 1 минуту. Примерно...
Но в любом случае программа сама потом выключит ПК
Зачем?
Процесс "выключения Windows" достаточно хорошо оптимизирован под среднего пользователя.
northener вне форума Ответить с цитированием
Старый 18.09.2014, 02:29   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Идея у меня в том, что бы задержать выключение Windows хотя бы на 1 минуту. Примерно...
этим облом. Выключением можно прервать, прервав цепочку сообщений. Чтобы не пошло само ENDSESSION.
Человек_Борща вне форума Ответить с цитированием
Старый 18.09.2014, 02:53   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Выключением можно прервать, прервав цепочку сообщений. Чтобы не пошло само ENDSESSION.
Прервать выключение в Винде 7 это сродни остановить Савранского.
northener вне форума Ответить с цитированием
Старый 18.09.2014, 08:09   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Прервать выключение в Винде 7 это сродни остановить Савранского.
Есть некоторые случаи когда это необходимо. Например для СУБД это критично может быть. Сессии не закрыты, транзакции не проведены, или deadlock какой, и нужно правильно завершить работу СУБД, иначе в следующий раз она может не запуститься. Поэтому нельзя давать выключать пока пользователь не завершит корректно работу программы.
Возможно у автора такая же критическая программа.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.09.2014, 09:59   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
In Windows Vista, if your application must block shutdown, in addition to returning FALSE or not responding to WM_QUERYENDSESSION, it should leverage this new UI by using a simple API to provide Windows with a reason string explaining why it is blocking shutdown. This API is straightforward:

BOOL ShutdownBlockReasonCreate(HWND hWnd, LPCWSTR pwszReason);

BOOL ShutdownBlockReasonDestroy(HWND hWnd);

BOOL ShutdownBlockReasonQuery(HWND hWnd, LPWSTR pwszBuff, DWORD *pcchBuff);

Use of this API is detailed more fully later in this topic, as well as in the MSDN documentation for the individual ShutdownBlockReason() functions.

Again, note that this API does not replace the need to return FALSE (or delay responding) to WM_QUERYENDSESSION to block shutdown. Applications need to do this in addition to using the API. Applications that return TRUE to WM_QUERYENDSESSION will be closed at shutdown, regardless of whether they have used the API.
Советую почитать
Цитата:
Выключением можно прервать, прервав цепочку сообщений. Чтобы не пошло само ENDSESSION.
WM_QUERYENDSESSION прерывать не нужно.(да и нет смысла)
а в WM_ENDSESSION можно уже ждать.

в ХР просто не отвечаем на WM_ENDSESSION столько сколько нужно.
в VIsta и выше нужно применить функции процитированные выше.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
отменить действие кнопки else m1zantrop Общие вопросы Delphi 33 11.06.2012 10:57
спонтанное выключение компьютера. или вообще не запускается. divwond Компьютерное железо 7 13.04.2011 21:56
Отменить сортировку в NextGrid George2010 Компоненты Delphi 3 09.01.2011 16:34
Как отменить поток RIO Общие вопросы Delphi 11 12.10.2009 00:29
Как отменить процедуру? KoBRaAndrey Общие вопросы Delphi 5 05.10.2009 11:12