Monitor wider einschalten
-
Hallo,
Ich habe ein kleines Programm mithilfe des .net-Frameworks unter Visual C++ erstellt, welches eine Art Wecker nachbilden soll. Nach Eingabe der Weckzeit und Start des Weckers schaltet das Programm den Monitor mittels des API-Befehls "SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2)" ab. Nach Erreichen der Weckzeit, erzeugt das Programm einen Weckton (pulsierender Sinuston) und schaltet den Monitor mittels des Befehls "SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, -1)" wider ein.
Soweit funktioniert das Ganze auch wie gedacht. Ein Problem ergibt sich jedoch, wenn in der Zwischenzeit (während auf die Weckzeit gewartet wird und der Monitor bereits über den API-Befehl abgeschaltet wurde) das Betriebssystem (Windows 7) selbst "zusätzlich" den Monitor abschaltet (eben je nach Zeiteinstellung in den Energieoptionen). In diesem Fall schafft es mein Programm nicht, den Monitor bei erreichen der Weckzeit wider einzuschalten. Der Monitor schaltet sich zwar kurz ein, wird aber sofort (~1s) wider abgeschalten. Es scheint als wäre das Betriebssystem hier dominanter und versucht mit aller Gewalt das abgeschaltet lassen des Monitors durchzusetzen.
Nun möchte ich Euch fragen, ob Ihr vielleicht diesbezüglich einen Lösungsansatz hättet, damit mein Programm den Monitor immer einschalten kann, ohne nun einfach in den Energieeinstellungen von Windows die Monitorabschaltzeit auf „nie“ zu setzen?
Vielen Dank im Voraus und beste Grüße,
Roland.
-
Wäre es nicht eh sinnvoller den Computer ganz in den Energiesparmodus zu bringen anstatt nur den Monitor auszuschalten? Ansonsten hast Du einen 500 Watt/h "teuren" Wecker...
Vielleicht hilft Dir das ja weiter: http://www.pcreview.co.uk/forums/simulate-wake-up-computer-run-task-feature-taskscheduler-c-t3451405.html
-
Hallo,
Vielen Dank für Deine Antwort!
Nun, die Idee, den PC in den Stand-by-Modus zu versetzen und per BIOS-Timer wider aufzuwecken ist grundsätzlich gut, jedoch für meine Anwendung nicht ganz optimal.
Hintergrund ist jener, dass mein Programm nicht nur einen Wecker nachahmt, sondern auf Befehl auch die Uhrzeit groß am Bildschirm anzeigt. Das Programm überwacht permanent den Pegel des am PC angeschlossenen Mikrofons. Ist dieser für mehr als eine vorgegebene Zeit höher als ein vorgegebener Pegel, schaltet das Programm den Bildschirm ein, und stellt am Desktop die aktuelle Uhrzeit im Siebensegmentstil groß dar. Nach einer gewissen Zeit, schaltet das Programm den Monitor wider ab, und wartet auf neue Ereignisse. Somit kann ich in der Nacht einfach und unkompliziert die Uhrzeit erfahren, ohne von dauerleuchtenden Anzeigen gestört zu werden ;-).
Da der Monitor aufgrund des geschilderten Problems jedoch nach etwa einer Sekunde wider ausgeht, ist es recht schwierig, die Uhrzeit derart schnell zu lesen.
Leistungsbedarf:
Ein PC benötigt eine Leistung von 500 W so gut wie nie, maximal bei aufwendigen 3D Berechnungen, wo sowohl die CPU als auch die GPU mit voller Rechenleistung arbeiten. Ein PC im Windowsnormalbetrieb benötigt eine deutlich geringere elektrische Leistung, speziell dann, wenn sowohl Monitor, als auch Festplatte abgeschaltet sind.
Zudem handelt es sich bei meinem PC um einen Notebook, welcher ohnedies deutlich weniger Leistung als ein Desktop PC verbraucht. Das Netzteil liefert maximal 80 W, somit kann man davon ausgehen, das maximal 100 W aufgenommen werden. In besagtem Modus gehe ich von weniger als die Hälfte aus, also um die 50W.Klar, eine ökologische Lösung sieht anders aus, aber ganz so schlimm ist die Energiebilanz auch nicht, wenn man bedenkt, dass ein Billigradiowecker auch gut und gerne 10 W oder mehr permanent fordert ;-).
Vielleicht weiß ja jemand eine Lösung für mein Problem.
Danke.
-
In der WinAPI gibts da noch folgende Möglichkeit:
SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED );
Damit sagt man dem Windows das der Thread zu keinem Zeitpunkt in einen Energiesparmodus gehen darf. Solange der Thread läuft kann das System dann nicht in den energiesparmodus gehen. In deinem Fall reicht vielleicht auch schon ES_DISPLAY_REQUIRED um zu verhindern das das System selbst versucht den Bildschirm abzuschalten.
-
Hallo,
Vielen Dank für den sehr, sehr hilfreichen Hinweis! Dies ist exakt die Lösung, die ich gesucht habe, sie funktioniert perfekt, danke.
Der Befehl "SetThreadExecutionState(ES_DISPLAY_REQUIRED)" - um den Windows Monitor-Timeout-Timer zurückzusetzen - vor dem Befehl zum Einschalten des Monitors hat genügt, um zu verhindern, das Windows den Monitor sofort wider ausschaltet.
Nochmals danke für die perfekte Hilfe.