Einzelnen Beitrag anzeigen

Benutzerbild von Bambuti2000
Bambuti2000

Registriert seit: 11. Okt 2007
Ort: Troisdorf
44 Beiträge
 
Delphi XE2 Architect
 
#1

Ruhezustand / Hibernate unter Windows 7 und Windows HomeServer 2011

  Alt 10. Aug 2012, 17:34
Hallo Leute,

bin jetzt schon seit zwei Tagen dran, und bekomme das Problem einfach nicht in den Griff.
Folgendes Problem (welches auch schon oft diskutiert wurde aber leider keine Lösung bringt) habe ich:
Vor dem Ruhezustand oder Standby soll noch ein Script ausgeführt werden, welches diverse andere Geräte im Netzwerk herunterfährt bzw. auch in Ruhezustand versetzt.
Unter Windows XP bekomme ich auch die BROADCAST_MESSAGE für die Anfrage zum Standby und kann soweit auch noch weiter aggieren, aber unter Windows 7 und HomeServer 2011 wird nur PBT_APMSUSPEND gesendet, und bevor ich das Abschalten des Systems (weder mit BROADCAST_QUERY_DENY noch mit ES_AWAYMODE_REQUIRED) verhindern kann ist es auch schon aus. Somit kann ich natürlich auch keine andern Programme oder Skripte mehr starten.

Ich hoffe dass das einigermassen verständlich klingt?!?!

Also, kurz ausgedrückt,
ich muss unter Windows 7 noch etwas starten bevor der Hibernate-/Suspend-Modus eintritt.
Da dies vermutlich nur geht, wenn ich den Vorgang für meine Ausführung unterbreche, benötige ichetwas um den Hibernate/Suspend abzubrechen bzw. pausieren zu lassen.

Damit ihr's testen könnt, hier mein Quelltext:
Delphi-Quellcode:
const
  ES_SYSTEM_REQUIRED = DWORD($00000001);
  {$EXTERNALSYM ES_SYSTEM_REQUIRED}
  ES_DISPLAY_REQUIRED = DWORD($00000002);
  {$EXTERNALSYM ES_DISPLAY_REQUIRED}
  ES_USER_PRESENT = DWORD($00000004);
  {$EXTERNALSYM ES_USER_PRESENT}
  ES_CONTINUOUS = DWORD($80000000);
  {$EXTERNALSYM ES_CONTINUOUS}
  ES_AWAYMODE_REQUIRED = DWORD($00000040);
  {$EXTERNALSYM ES_AWAYMODE_REQUIRED}

type
  EXECUTION_STATE = DWORD;

function SetThreadExecutionState(esFlags: EXECUTION_STATE): EXECUTION_STATE; stdcall; external 'kernel32.dll';

procedure WndProc(var MyMessage: TMessage);
begin
  if (MyMessage.Msg = WM_POWERBROADCAST)
  or (MyMessage.Msg = WM_POWER) then
  begin
    {*** die ganzen MESSAGES hab ich mal zum Testen mit aufgenommen... ***}
    if (MyMessage.WParam = PBT_APMQUERYSUSPEND)
    or (MyMessage.WParam = PWR_SUSPENDREQUEST)
    or (MyMessage.WParam = PBT_APMQUERYSTANDBY)
    or (MyMessage.WParam = PBT_APMSUSPEND)
    or (MyMessage.WParam = PBT_APMSTANDBY)
    or (MyMessage.WParam = PBT_POWERSETTINGCHANGE)
    or (MyMessage.WParam = PBT_APMPOWERSTATUSCHANGE) then
    begin
      {*** hier würde ich gerne Pause machen ***}
      SetThreadExecutionState(ES_AWAYMODE_REQUIRED);
      MyMessage.Result := BROADCAST_QUERY_DENY;

      {*** das zuvor gewählte Programm wird ausgeführt, aber halt eben erst zu spät ***}
      {*** und der Standby wird einfach knallhart fortgesetzt ***}
      if (SelectEdt1.Text <> EmptyStr) then
        ShellExecute_AndWait(SelectEdt1.Text, SelectParamEdt1.Text);

      {*** nach erledigter Arbeit soll das System einfach da weitermachen, wo ich es unterbrochen habe ***}
      //MyMessage.Result := 1;
      //SetThreadExecutionState(ES_CONTINUOUS);
    end
    else
      if (MyMessage.WParam = PBT_APMRESUMECRITICAL)
      or (MyMessage.WParam = PBT_APMRESUMESUSPEND)
      or (MyMessage.WParam = PBT_APMRESUMESTANDBY)
      or (MyMessage.WParam = PBT_APMRESUMEAUTOMATIC) then
      begin
        {*** und hier wird ein anderes Programm beim RESUME ausgeführt, klappt prima ***}
        if (SelectEdt2.Text <> EmptyStr) then
          ShellExecute_AndWait(SelectEdt2.Text, SelectParamEdt2.Text);
      end;
    end;
  inherited WndProc(MyMessage);
end;
Stefan
  Mit Zitat antworten Zitat