![]() |
Re: Ruhezustand blockieren-> Versuch erkennen -> selbs
wo ist das problem?
verarbeite die message, sage nein zum supend, hibernate oder was auch immer. speichere deine daten und entferne sie aus deiner anzeige, danach setzt du eine boolean-variable auf true. dann rufst du die funktion für den suspend/hibernate modus auf und erlaubst bei erneuter messageverarbeitung anhand deiner vorher gesetzten variablen den suspend/hibernate. das sollte die einfachste methode darstellen. |
Re: Ruhezustand blockieren-> Versuch erkennen -> selbs
Das ist mir schon klar. Ich hab nur Probleme damit, zu Überprüfen, ob das WM_Powerbroadcast auch wegen dem Ruhezustand ausgelöst wurde und nicht wegen z.B. einem Reboot.
Diese Impementierung
Delphi-Quellcode:
scheint jedenfalls nicht zu funktionieren.
if msg.msg=PBT_APMQUERYSUSPEND then
|
Re: Ruhezustand blockieren-> Versuch erkennen -> selbs
Ich habe jetzt eine Lösung für mein Problem gefunden und poste sie hier:
Oben in der Definition der Form müssen folgende 2 Einträge hinzugefügt werden:
Delphi-Quellcode:
Und im Code-Abschnitt die folgenden 3 Prozeduren:
procedure WMPowerBroadcast(var Msg: TWMPower); message WM_POWERBROADCAST
readyforsuspend:boolean;
Delphi-Quellcode:
function EnableShutDownPrivilege: Boolean;
var vi: TOSVersionInfo; hToken: THandle; tp: TTokenPrivileges; h: DWord; begin result := False; vi.dwOSVersionInfoSize := SizeOf(vi); GetVersionEx(vi); if vi.dwPlatformId = VER_PLATFORM_WIN32_NT then // Windows NT begin OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken); LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tp.Privileges[0].Luid); tp.PrivilegeCount := 1; tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; h := 0; result := AdjustTokenPrivileges(hToken, False, tp, 0, PTokenPrivileges(nil)^, h); CloseHandle(hToken); end; end; procedure TForm1.WMPowerBroadcast(var Msg: TWMPower); begin if ((msg.powerevt=PBT_APMQUERYSUSPEND) and (not readyforsuspend)) then begin Msg.Result := BROADCAST_QUERY_DENY; readyforsuspend:=true; suspend(self); end; end; procedure suspend(var form:tform1) {die Variable form1 wird hier übertragen, damit auch von der Klassenunabhängigen Prozedur SUSPEND auf die form zugegriffen werden kann.}); begin {hier Speichervorgänge, wie das Schliesen des Forms etc. vornehmen. Sie dürfen beliebig lange dauern.} if enableshutdownprivilege then setsystempowerstate(true,false); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz