![]() |
Batchdatei mit ShellExecute nach Standby bzw. Ruhezustand?
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:
Der Vollständigkeit halber habe ich die Standby und Suspend Messages auch gleich mit eingebaut.
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; 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. |
Re: Batchdatei mit ShellExecute nach Standby bzw. Ruhezustan
Ersteinmal willkommen in der DP!
Zu deinem Code: PBT_APMSTANDBY und PBT_APMRESUMESTANDBY werden laut MSDN glaube ich nicht unterstützt (Warum auch immer...). Außerdem verstehe ich nicht ganz wieso du beim Eintritt in den Standby auch ein ShellExecute ausführst. Falls das beabsichtigt ist, was ich für seltsam halte (wenn ich in den Standby gehe will ich doch keine Programme starten :gruebel:), solltest du vielleicht mal einen Blick auf ![]() Zu deiner zweiten Frage: Laut MSDN war das meine ich schon richtig. Wie man nun erfahren könnte ob es sich um einen Standby oder Ruhezustand handelt weiß ich gar nicht. |
Re: Batchdatei mit ShellExecute nach Standby bzw. Ruhezustan
Also ich verstehe nicht wozu du überhaupt das aktuelle Verzeichnis wechselst. Du kannst in ShellExecute doch einen kompletten Pfad in dem Dateinamen angeben und statt als Arbeitsverzeichnis für den neuen Prozess nil anzugeben, kannst du auch das richtige Verzeichnis angeben.
Zudem kannst du als Parameter auch direkt PChar(DeinString) angeben statt den komplizierten Weg über StrPCopy zu gehen. So ist das jeweils nur die eine Zeile. ;-) // EDIT: Außerdem sollte der zweite Parameter 'open' sein, schließlich ist die auszuführende Operation nicht nil, also nix. // EDIT2: Vielleicht solltest du dir die Dokumentation noch einmal anschauen: ![]() |
Re: Batchdatei mit ShellExecute nach Standby bzw. Ruhezustan
Zitat:
Zitat:
Die Strings StandByPrg und SuspendPrg sind leer, Shellexecute wird hier also nicht ausgeführt. (hätte ich gleich dazuschreiben sollen) Im Prinzip ist es mir eigentlich auch egal, ob der Rechner aus dem Suspend oder dem Standby kommt. Ausführen will ich momentan das Gleiche. Zum Hintergrund, es geht um mein Notebook. Hier zu Hause ist über HDMI ein externes WSXGA+ Display angeschlossen, im Büro habe ich nur ein Display mit 1024x768 Bildpunkten. Das Notebook wird eigentlich generell nur in den Ruhezustand versetzt. Dann uss ich natürlich jedes Mal die Auflösung ändern. Das will ich automatisieren, da es anscheinend keinen vernünftigen Desktop-Manager gibt, der das beherscht, ohne dass ich irgend etwas anklicken muss. Das Batchfile macht das auch schon ganz vernünftig, nur automatisch klappt es noch nicht. Wenn es sauber funktioniert, dann werde ich wohl die Auflösung etc. direkt ändern. @jaenicke Danke für den Link. Irgendwie habe ich die Doku nicht mehr gefunden und von daher einfach was aus Beispielen genommen. Schaue mir das gleich an, teste das geänderte Programm und melde mich dann wieder. Gruß BlackGuest PS: Danke für die überschnellen Antworten. Da kommt man ja mit schreiben gar nicht nach :thumb: . |
Re: Batchdatei mit ShellExecute nach Standby bzw. Ruhezustan
So, ich habe den Qelltext mal abgeändert.
aktueller Stand:
Delphi-Quellcode:
Beim Erwachen aus dem Standby passier gar nichts. ShellExecute sollte zwar abgearbeitet werden aber es passiert nichts. Lasse ich den MessageDlg drin, wird das Batchfile nach dem OK sauber abgearbeitet.
procedure TMainForm.WMPowerBroadcast(var Msg: TMessage);
var path: 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 if Msg.wParam=PBT_APMRESUMESUSPEND then if (WUfromSuspendPrg<>'')and(Fileexists(WUfromSuspendPrg)) then begin // MessageDlg('Resume from Suspend Mode', mtInformation,[mbOk], 0); path:=extractFilePath(WUfromSuspendPrg); ShellExecute(Handle,'open',PChar(WUfromSuspendPrg),'',PChar(Path),1); end; end; Beim Erwachen aus dem Ruhezustand bekomme ich wieder eine Zugriffsverletzung ('access violation at...". Scheint also doch so zu sein, dass der Aufruf irgendwie zu früh erfolgt. :?: Gruß BlackGuest |
Re: Batchdatei mit ShellExecute nach Standby bzw. Ruhezustan
Hmm, unter Vista funktioniert das Ausführen einer Batchdatei an der Stelle. XP habe ich gerade nicht da, das werde ich gleich in einer VM testen.
Hast du einmal versucht den Fehler mit try..except abzufangen? Dann könntest du einmal schauen, ob der Fehler genau bei ShellExecute auftritt indem du nur das ins try..except packst. Da das Tool ja nur für dich sein soll, warte doch einfach z.B. 2 Sekunden oder so, das kannst du ja testen wann es dann geht. Wenn du nur die Auflösung ändern willst, warum machst du das denn per Batchdatei? Mit Delphi könntest du gleich überprüfen, ob es funktioniert hat usw. |
Re: Batchdatei mit ShellExecute nach Standby bzw. Ruhezustan
Zitat:
Aber wie dem so ist, wenn was nicht funktioniert, dann will ich wissen warum und wie man das in den Griff bekommt. :wink: Ja, den Fehler verursacht ShellExecute. Habe ich gerade mal ausprobiert. Gruß BlackGuest |
Re: Batchdatei mit ShellExecute nach Standby bzw. Ruhezustan
Habe noch mal etwas rumgespielt. Nicht ShellExecute verursacht den Fehler sondern das Programm, welches ich über die Batchdatei aufrufe. Das ändert auch die Auflösung. Dabei scheint kurz nach dem Wakeup irgend etwas schief zu gehen.
Also an der falschen Stelle gesucht. OK, denn mache ich mich mal selbst an die Implementierung. Danke für eure schnelle Hilfe. Gruß BlackGuest |
Re: Batchdatei mit ShellExecute nach Standby bzw. Ruhezustan
Zitat:
Deshalb kam ja auch mein Vorschlag es direkt in Delphi zu machen. Wie das geht steht hier: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz