Standby Modus in einem Programm auch unter Vista verhindern
Manchmal kann man den Standby Mode wirklich nicht gebrauchen. Besonders, wenn man ein Programm hat, dass evtl. viel im Hintergrund mit einer Datenbankverbindung macht.
Wie macht man es unter Windows Vista richtig, denn BROADCAST_QUERY_DENY bei einem PBT_APMQUERYSUSPEND oder PBT_APMQUERYSUSPENDFAILED zurückzugeben funktioniert nicht.
Man muss SetThreadExecutionState verwenden!
Äußerst dumm nur, dass man dies auch wirklich für Windows Vista und Windows 7 berücksichtigen muss. Ich hatte natürlich für Windows 2000 und XP entsprechenden Code vorgesehen, die den Standby verhindern, aber wie schon erwähnt, das geht eben unter Vista nicht mehr.
Es gibt Inkompatibilitäten zwischen des OSen, die man wirklich explizit behandeln muss. Es lohnt sich ein Blick in die Dokus, den ich selber oft genug nicht mache…
// Every 30 secs we disallow the standby and hibernate! // We have to use ES_AWAYMODE_REQUIRED on Vista and Windows Server 2008 // If we allow standby and hibernation we get problems with the DB connection. DWORD dwAwaymodeRequired = 0; OSVERSIONINFO os; ::ZeroMemory(&os,sizeof(os)); os.dwOSVersionInfoSize = sizeof(os); if (::GetVersionEx(&os) && os.dwMajorVersion>=6) dwAwaymodeRequired = ES_AWAYMODE_REQUIRED; VERIFY(::SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | dwAwaymodeRequired));
3 Kommentare zu “Standby Modus in einem Programm auch unter Vista verhindern”
Link für diesen Beitrag | RSS-Feed zu diesem Beitrag
Hinterlassen sie einen Kommentar:
Beachten sie bitte, dass Kommentare evtl. nicht sofort hier erscheinen. Die Kommentare werden zur Moderation an den Webmaster gesendet. Es kann also etwas dauern, bis Ihr Kommentar hier veröffentlicht wird!
on Fr 30 Jul 2010 um 22:08 #
Raik
Für Verwendung mit VC++6.0 bietet sich noch an:
#ifndef ES_AWAYMODE_REQUIRED
#define ES_AWAYMODE_REQUIRED 0x00000040L
#endif
da dessen Header diesen Wert noch nicht kannten.
on Do 02 Sep 2010 um 09:29 #
Raik
Warum sollte man eigentlich diese Aktivierung periodisch aufrufen? Evtl. nur um das Rücksetzen aus anderen Threads zu umgehen? In den MSDN Remarks habe ich nichts darüber gefunden. Grüße
on Do 02 Sep 2010 um 17:24 #
Martin Richter
Weil das so in der Doku steht! Einfach mal lesen:
http://msdn.microsoft.com/en-us/library/aa373208(VS.85).aspx
The system automatically detects activities such as local keyboard or mouse input, server activity, and changing window focus. Activities that are not automatically detected include disk or CPU activity and video display.
Calling SetThreadExecutionState without ES_CONTINUOUS simply resets the idle timer; to keep the display or system in the working state, the thread must call SetThreadExecutionState periodically.