Ich möchte mir ein kleines Programm schreiben, was mir nach dem Erwachen aus dem Standby bzw. Ruhezustand eine Batchdatei ausführt.
So weit bin ich bisher gekommen:
Delphi-Quellcode:
procedure TMainForm.WMPowerBroadcast(
var Msg: TMessage);
var Befehl:
array[0..500]
of char;
oldpath,path,temp:
String;
const
PBT_APMQUERYSUSPEND = $0000;
PBT_APMBATTERYLOW = $0009;
PBT_APMQUERYSTANDBY = $0001;
PBT_APMQUERYSUSPENDFAILED = $0002;
PBT_APMQUERYSTANDBYFAILED = $0003;
PBT_APMSUSPEND = $0004;
PBT_APMSTANDBY = $0005;
PBT_APMRESUMECRITICAL = $0006;
PBT_APMRESUMESUSPEND = $0007;
PBT_APMRESUMESTANDBY = $0008;
PBTF_APMRESUMEFROMFAILURE = $00000001;
PBT_APMPOWERSTATUSCHANGE = $000A;
PBT_APMOEMEVENT = $000B;
begin
case Msg.wParam
of
PBT_APMSTANDBY:
begin
if (StandByPrg<>'
')
and(Fileexists(StandByPrg))
then
begin
// MessageDlg('Go to Standby Mode', mtInformation,[mbOk], 0);
oldPath:=GetCurrentDir;path:=extractFilePath(StandByPrg); chDir(path);
temp:=extractFileName(StandByPrg); StrPCopy(Befehl,temp);
ShellExecute(
Handle,
nil,befehl,'
',
nil,1);
ChDir(oldPath);
end;
end;
PBT_APMSUSPEND:
begin
if (SuspendPrg<>'
')
and(Fileexists(SuspendPrg))
then
begin
// MessageDlg('Go to Suspend Mode', mtInformation,[mbOk], 0);
oldPath:=GetCurrentDir;path:=extractFilePath(SuspendPrg); chDir(path);
temp:=extractFileName(SuspendPrg); StrPCopy(Befehl,temp);
ShellExecute(
Handle,
nil,befehl,'
',
nil,1);
ChDir(oldPath);
end;
end;
PBT_APMRESUMESUSPEND:
begin
if (WUfromSuspendPrg<>'
')
and(Fileexists(WUfromSuspendPrg))
then
begin
// MessageDlg('Resume from Suspend Mode', mtInformation,[mbOk], 0);
oldPath:=GetCurrentDir;path:=extractFilePath(WUfromSuspendPrg); chDir(path);
temp:=extractFileName(WUfromSuspendPrg); StrPCopy(Befehl,temp);
ShellExecute(
Handle,
nil,befehl,'
',
nil,1);
ChDir(oldPath);
end;
end;
PBT_APMRESUMESTANDBY:
begin
if (WUfromStandByPrg<>'
')
and(Fileexists(WUfromStandByPrg))
then
begin
// MessageDlg('Resume from Standby Mode', mtInformation,[mbOk], 0);
oldPath:=GetCurrentDir;path:=extractFilePath(WUfromStandByPrg); chDir(path);
temp:=extractFileName(WUfromStandByPrg); StrPCopy(Befehl,temp);
ShellExecute(
Handle,
nil,befehl,'
',
nil,1);
ChDir(oldPath);
end;
end;
end;
end;
Der Vollständigkeit halber habe ich die Standby und Suspend Messages auch gleich mit eingebaut.
Das Programm soll also in den Pfad der Datei wechseln, die Datei ausführen und dann den alten Pfad wieder herstellen. Funktioniert aus diesem Zusammenhang genommen für sich auch so wie erwünscht. Nur nach dem Erwachen in Zusammenhang mit dem obigen Code nicht.
Ich habe teilweise unterschiedliche Fehlermeldungen bekommen. Einmal "application-defined
exception (code 0xC0000006)" an nicht bestimmbarer Stelle und einmal "EInOutError 'E/A Fehler 1231' beim Ausführen von ShellExecute.
Füge ich eine Pause ein oder lass den auskommentierten MessageDlg drin, funktioniert es.
Woran könnte das Problem liegen? Muss ich irgendwie warten, bis das Windows (XP Professional) wieder komplett hochgefahren ist?
Zweites Problem, egal ob ich den Rechner in den Standby oder in den Ruhezustand schicke, beim Erwachen hat Msg.wParam den Wert PBT_APMRESUMESUSPEND. Da stimmt doch auch irgend etwas nicht.
Falls noch irgendwas zum Code oder zum System fehlt bitte melden.
Gruß
BlackGuest
[Edit]
Der Fehler "application-defined
exception (code 0xC0000006)" tritt beim Erwachen aus dem Ruhezustand auf. So wie es aussieht bevor Shellexecute ausgeführt wird. "EInOutError 'E/A Fehler 1231" kommt beim Erwachen aus dem Standby bei der ausführung von Shellexecute.