Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
Delphi 2005 Personal
|
Re: Ruhezustand blockieren-> Versuch erkennen -> selbs
15. Mai 2006, 15:21
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:
procedure WMPowerBroadcast(var Msg: TWMPower); message WM_POWERBROADCAST
readyforsuspend:boolean;
Und im Code-Abschnitt die folgenden 3 Prozeduren:
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;
Michael Enßlin Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
|
|
Zitat
|