PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : StandBy Modus des Monitors ausschalten


Malte 2
06.08.2002, 21:13
Tach!

Ich würde gerne wissen, wie man mit dem Windows-API den StandBy-Modus des Monitors abschalten kann. Ist das möglich, wie geht es und was muss ich beachten?


xOOn
07.08.2002, 08:22
falsches forum passt in winapi

Malte 2
07.08.2002, 08:32
Original geschrieben von xOOn
falsches forum passt in winapi

Ups, das Forum hab ich gar nicht gesehen!

Zapata
07.08.2002, 19:43
Benutze die Window-Message WM_SYSCOMMAND wie unten:


case WM_SYSCOMMAND:
{
switch (wParam)
{
case SC_MONITORPOWER:
return 0;
}
break;
}

Malte 2
07.08.2002, 22:40
Danke!

Aber wenn ich das Thema zur WM_SYSCOMMAND Meldung in der MSDN-Library richtig verstanden habe, kann man damit nur Abfragen, ob sich der Monitor im StandBy-Modus befindet. Kann man ihn den auch ihn den Normalmodus zurückschalten (Moment, jetzt ist mir gerade etwas eingefallen . . .)?

Shooter
07.08.2002, 23:37
MSDN-Library:
An application can carry out any system command at any time by passing a WM_SYSCOMMAND message to DefWindowProc. Any WM_SYSCOMMAND messages not handled by the application must be passed to DefWindowProc. Any command values added by an application must be processed by the application and cannot be passed to DefWindowProc.

Wenn ich das richtig verstehe, solltest du so eine Nachricht an DefWindowProc übergeben. Wenn das nicht funktioniert, probier es mal mit SendMessage.

Zapata
08.08.2002, 00:33
Mit dem Code oben schickst du die Message nicht in dein Message-Loop und fängst sie somit ab. Wenn du den Code oben nicht schreibst wird die Message an DefWindowProc() übergeben.
(und das darf es eben nicht)

Probier es aus es funktioniert.

Malte 2
08.08.2002, 09:15
@ Shooter: DefWindowProc() wurde ja schon immer aufgerufen, weil ich ja keine case-Marke für WM_SYSCOMMAND hatte. Aber an wen soll ich denn SendMessage() senden. An mein eigenes Fenster wäre ja sinnlos.

@ Zapata: Ich hab den Code so, wie du ihn mir gegeben hast, in meine Nachrichtenschleife des Hauptfensters eingefügt. Wenn ich das richtig verstanden habe, soll er verhindern, dass der Monitor überhaupt in den StandBy-Modus wechselt. Aber das klappt nicht.

Vielleicht noch mal eine nähere Beschreibung:
In meinen Programm wird ständig mit Hilfe eines Timers überprüft, ob ein bestimmtes Ereignis vorliegt. Sobald dieses Ereignis eingetreten ist, soll der Monitor, falls er sich im StandBy-Modus befindet, in den Normalmodus wechseln.

Shooter
08.08.2002, 18:53
Wie wäre es, wenn du die Nachricht per SendMessage an HWND_BROADCAST sendest? Keine Ahnung, ob das funktioniert.

Malte 2
09.08.2002, 04:22
Danke!

Das klappt . . . fast. Ich habe die SendMessage() so benutzt:

SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 0);

Sobald diese Nachricht gesendet wird, wechselt der Monitor ganz kurz aus dem StandBy-Modus in den Normalmodus. Anschließend (eine Sekunde vielleicht) pennt der Monitor wieder ein. Wenn das jetzt noch so klappt, dass der in der Systemsteuerung eingestellte Timer für den StandBy dann auch läuft, klappt ja alles!

Und: Wenn der StandBy-Modus überhaupt nicht an war, wechselt der Monitor ganz kurz in diesen Modus und das ist natürlich gar nicht gut . . .

Ich weiß jetzt auch gar nicht mehr so recht, ob HWND_BROADCAST überhaupt Sinn macht. Die Nachricht wird ja dann an alle TOP Fenster gesendet und ob das logisch ist?! Die Nachricht müsste irgendwie an Windows oder so gehen.

TekWarrior
16.08.2002, 00:04
Versuchs mal mit

BOOL SetSystemPowerState(
BOOL fSuspend,
BOOL fForce
);

Damit wird der StandBy Modus gestartet/beendet.
Sollte eigentlich mit SetSystemPowerState(FALSE,TRUE); klappen.

Malte 2
16.08.2002, 00:39
:(

Der erste Parameter wird ja ignoriert, deshalb hab ich für den zweiten true und false probiert. Immer dasselbe: Der Computer wird in den Ruhezustand versetzt. Eigentlich wollte ich ja nur den Monitor aufwecken :p . . .

Trotzdem danke :)!

Format C:
16.08.2002, 11:48
Mit SetSystemPowerState wird der Rechner in den Stand By gesetzt und nicht der Monitor!

Der Moni läst sich in den Normalzustand schalten mit :
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, -1);

xOOn
16.08.2002, 12:08
also wenn du nur verhindern willst dass der monitor ausschalten, setze doch mit SetCursorPos die maus alle minute um einen pixel nach oben und dann wieder zurueck, vielleicht laesst sich windows dadurch bescheissen

Format C:
16.08.2002, 12:16
Es kommt mir so vor als wenn der StandBy Modus mit SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 0); ein klein wenig anders ist als der StandBy in den Windows schaltet.

Bei SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 0); blinkt oben links ein Cursor und es wir auch schneller in den StyndBy geschaltet als es Windows tut.

MfG

Malte 2
16.08.2002, 15:02
@ Format C:
-1 als lParam hat auch den Monitor wie 0 nur kurz in den Normalmodus geschaltet.

@ xOOn:
Yeah, Windows lässt sich echt durch SetCursorPos() bescheißen. Ich will ja gar nicht verhindern, dass der Monitor in den StandBy-Modus schaltet, ich will ihn nur bei Bedarf ausschalten. Wenn dieser Fall eingetreten ist, wird der Cursor einfach in den Bildschirmmitte gesetzt und der Monitor wacht auf :D!

Vielen Dank euch allen :) :D :) !

Malte 2
16.08.2002, 16:43
Es geht sogar noch besser! Jetzt ermittel ich einfach mit GetCursorPos() die aktuelle Position des Cursors und rufe dann SetCursorPos() auf und übergebe diese Koordinaten. Der Cursor wird gar nicht verschoben und der Monitor wacht trotzdem auf. Perfekt!

Shooter
16.08.2002, 20:20
Eine komische Idee, aber solange es klappt... man kommt eben auch über Ankara von Köln nach Rom.

STSC
07.03.2005, 17:44
Hallo,

habe genau das gleiche Problem, bei mir funktionierts aber irgendwie nicht so wie bei dir Malte 2.
Folgende Ausganssituation:
PC wird in den Standby Modus (S3) geschickt und dann per Win XP Taskscheduler wieder aufgeweckt. Jedoch bleibt der Monitor nach dem Standby solange schwarz, bis ich die Maus bewege oder eine Taste drücke.
Aber irgendwie kann ich das mir VB .NET nicht simulieren.
Hier mein Code:

Public Structure POINTAPI
Dim x As Integer
Dim y As Integer
End Structure
Private Declare Function GetCursorPos Lib "user32" (ByRef lpPoint As POINTAPI) As Integer
Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long

Dim Pt As New POINTAPI
GetCursorPos(Pt)
SetCursorPos(Pt.x, Pt.y)

Habe auch schon SendMessage/PostMessage probiert, ohne Erfolg.
Bräuchte dringendst eine Lösung. Danke!!