Do wykrywania i zapobiegania wyłączaniu komputera używam bardzo prostego programu. Ma tylko jeden formularz i jeden prywatny procedury jak poniżej:Zapobieganie zamykaniu systemu Windows
TForm3 = class(TForm)
private
procedure WMQueryEndSession(var Msg : TWMQueryEndSession) ;
message WM_QueryEndSession;
end;
i realizację
procedure TForm3.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
Msg.Result := 0; //so I don't want to shutdown while my program is running
end;
Skompilowałem to Delphi 5 i Delphi 2010. Obaj wykryć wyłączył. Ale kiedy skompilowałem w Delphi 2010; po zablokowaniu mój program się zamyka. (Komputer się nie wyłącza)
Jak uzyskać taki sam wynik z obydwu?
Czy mogę zapytać, dlaczego to robisz? zwykle jest niegrzeczne i nieuzasadnione zakłócanie zamykania. Poza tym ten rodzaj kodu wydaje się być kruchy i łamany z łatami bezpieczeństwa ... – MJB
@MJB: Napisałem kiedyś taki program dla siebie - inny niegrzeczny program (Windows Update, IIRC) uważał, że można ponownie uruchomić komputer, za każdym razem, gdy odwróciłem się na chwilę. To była prawdopodobnie jakaś błędna konfiguracja WU, ale skoro nie mogłem tego naprawić, lub wyłączyć (przywileje i wszystkie), mogłem przynajmniej uniemożliwić mu pogrążanie się w pracy.(przy okazji, jest to udokumentowane i zgodne z prawem zachowanie od czasu WinXP, a główny cel komunikatu: "WM_QUERYENDSESSION" jest wysyłany do wszystkich aplikacji, aby sprawdzić, czy któryś z nich ma zastrzeżenia do wyłączenia - jeśli tak, wyłączenie zostanie przerwane) – Piskvor