Чтобы обнаружить и предотвратить выключение компьютера, я использую очень простую программу. Она имеет только одну форму и одной частной процедуры, как показано ниже:Предотвращение закрытия Windows
TForm3 = class(TForm)
private
procedure WMQueryEndSession(var Msg : TWMQueryEndSession) ;
message WM_QueryEndSession;
end;
и реализацию
procedure TForm3.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
Msg.Result := 0; //so I don't want to shutdown while my program is running
end;
Я составил его Delphi 5 и Delphi 2010. Оба обнаружить завершение работы. Но когда я собрал в Delphi 2010; после предотвращения отключения моя программа закрывается. (ПК не выключается)
Как получить тот же результат от обоих?
Могу ли я спросить, почему вы это делаете? обычно грубо и необоснованно вмешиваться в выключение. Плюс этот тип кода имеет тенденцию быть хрупким и ломается с патчами безопасности ... – MJB
@MJB: Однажды я написал такую программу для себя - еще одна грубая программа (Windows Update, IIRC) подумала, что было нормально перезагружать компьютер, каждый раз, когда я повернулась спиной на минуту. Вероятно, это была некорректная конфигурация WU, но поскольку я не мог ее исправить или отключить (привилегии и все), я мог бы по крайней мере предотвратить ее из-за моей работы.(Кстати, это документированное и законное поведение с WinXP и основная цель сообщения: 'WM_QUERYENDSESSION' отправляется во все приложения, чтобы узнать, есть ли у кого-либо из них возражение на завершение работы - если это так, выключение прерывается) – Piskvor