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;