Einzelnen Beitrag anzeigen

ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#23

Re: Ruhezustand blockieren-> Versuch erkennen -> selbs

  Alt 15. Mai 2006, 14: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
  Mit Zitat antworten Zitat