Autor Beitrag
GhostWhoWalks
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 14.11.08 19:00 
Hallo Leute,

folgendes Szenario:

Auf dem Rechner läuft eine Applikation die unter anderem über ein P2P Netzwerk Daten austauscht. Wenn der Rechner durch den Benutzer in den Standby / Ruhezustand versetzt wird will ich mich noch ordnungsgemäß aus dem P2P Netzwerk abmelden. Unter XP hat man ja die Möglichkeit auf PBT_APMQUERYSUSPEND mit einem BROADCAST_QUERY_DENY zu antworten, um das Ganze zu verhindern, in Vista ist die Möglichkeit nicht merh gegeben. Aber die Zeit, die ich zwischen dem WM_POWERBROADCAST und dem eigentlichen Ausschalten habe reicht bei weitem nicht aus, um die Netzwerk-Kommunikation komplett abzuhandeln.

Hat irgendwer eine Idee, wie ich das Abschalten verhindern oder zumindest verzögern kann?

Grüße,
Marcus
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 14.11.08 19:28 
Hallo und :welcome: im Forum!

Die Windows API unter Vista bietet die Möglichkeit sich zu registrieren als Anwendung, die ggf. den Standbymodus / das herunterfahren verhindern oder verzögern möchte. Ich kann mich leider nicht mehr erinnern wie das aussah und weiß nicht, ob das auch mit .NET genauso geht, aber ich werde versuchen das wieder zu finden.

Was ich jetzt gefunden habe ist erstmal das:
msdn.microsoft.com/e...aa373233(VS.85).aspx

Wie gesagt weiß ich nicht, ob man das auch unter .NET mit C# benutzen kann, aber ich vermute es wird zumindest eine ähnliche Lösung geben, vielleicht hilft es dir ja.
GhostWhoWalks Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 17.11.08 15:11 
Hallo und danke schonmal für den Link!
Habe schon mit dem ThreadExecutionState herumexperimentiert. Effektiv kann ich über ES_AWAYMODE_REQUIRED und ES_CONTINUOUS verhindern, dass der Rechner in den Ruhezustand fährt (wohlbemerkt, ich will hiermit nicht das automatische in-den-Ruhezusand-Versetzen verhindern, das geht damit ja ohne weiteres, sondern den vom Benutzer initiierten Vorgang, z.B. durch Zuklappen eines Laptops o.ä.), allerdings sperrt der Rechner sich dann. Im Grunde könnte ich natürlich noch abfragen, ob der Rechner gesperrt ist und dann Abmeldung durchführen, danach den Rechner in den Ruhezustand versetzen. Allerdings habe ich keine Möglichkeit gefunden zu unterscheiden, ob der Rechner gewollt gesperrt wurde, oder durch das Verhindern des Ruhezustandes gesperrt worden ist. In beiden Fällen gibt es eine SessionChange Message, die aber nur besagt, dass ein lock / unlock stattgefunden hat. Außerdem gibt es beim Setzen von ES_AWAYMODE_REQUIRED und ES_CONTINUOUS keine WM_POWERBROADCASTs mehr, sonst hätte man das ja noch kombinieren können.
So wie es bisher ausschaut klappt das so, wie ich mir das vorgestellt habe nicht, also muss ich an anderer Stelle ein wenig basteln ;-)