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



BeitragVerfasst: Do 01.12.11 19:38 
Hallo zusammen,

ich würde gerne aus meinem Programm heraus meine Monitore aus dem Standby aufwecken.
In einem anderen Thread (www.c-sharp-forum.de...chicken_81739,0.html) hier in den Foren habe ich bereits eine Möglichkeit gefunden, wie man sie in den Standby versetzen kann. Da dachte ich mir, es sollte nicht so schwer sein das ganze für meine Bedürfnisse anzupassen.

Zuerst aber noch ein paar Worte zu meinem Programm, ich überwache mit dem FileSystemWatcher einen Ordner ob neue Dateien erstellt werden. Sollte das der Fall sein sollen die Monitore aktiviert werden.
Aus der Event-Routine des FileSystemWatcher-Objekts rufe ich die Aktivierungs-Funktion auf. Prinzipiell hat das auch funktioniert, leider gibt es ziemlich großes ABER...
Sobald Windows (ich arbeite unter Windows 7) die Monitore in den Standby versetzt hat erstelle ich auf meinem Laptop eine neue Datei in einem Ordner, den ich übers Netzwerk überwachen lasse.
Die Monitore zucken auch kurz, schreiben dann allerdings sofort wieder "Energiesparen aktiviert". Erst wenn ich die Datei noch einmal neu erstelle wachen sie auf. Es braucht quasi zwei Anläufe um die Monitore zu aktivieren. Es hat leider nichts gebracht meine Aktvierungs-Funktion zweimal hintereinander aufzurufen.

Hier mal der Code der Aktivierungs-Funktion:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
        private void DisplayOn_SendMessage() {
            const int display_on = -1;

            const int WM_SYSCOMMAND = 0x0112;
            const int SC_MONITORPOWER = 0xF170;

            try {
                this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)delegate() {
                    IntPtr windowHandle = new WindowInteropHelper(Application.Current.MainWindow).Handle;

                    SendMessage(windowHandle, WM_SYSCOMMAND, new IntPtr(SC_MONITORPOWER), new IntPtr((display_on)));
                });
            } catch (Exception ex) {
                Logger.WriteError("Couldnt activate display: " + ex.ToString());
            }
        }


Ich hoffe Ihr habt evtl. eine Idee, woran es liegt, dass es nicht gleich auf Anhieb klappt.

Grüße
Mathias


[EDIT:]

Ich habe gerade mal versucht was passiert, wenn mein Programm den Standby aktiviert und nicht Windows selbst: Dann geht es einwandfrei...
Warum brauchts es aber dann zwei Anläufe, wenn der Standby von Windows kommt?

Mir fällt momentan keine Lösung ein, wie ich mir das zu Nutzen machen kann. Der Rechner ist mehreren Zugänglich und es kann gut sein, dass auch mal eine Powerpoint o.ä. läuft.
Sollte jetzt jemand vergessen die Bildschirme über mein Programm zu deaktivieren wird Windows das nach einer Zeit x machen und mein Programm kann sie dann nicht wieder aufwecken.
Hat hierzu zufällig noch jemand eine Idee, wie ich es erzwingen kann, dass die Bildschirme durch mein Programm deaktiviert werden? Dann müsste es nämlich gehen.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 01.12.11 21:04 
Hallo,

ist jetzt nur ins Blaue geraten: probiere mal "Dispatcher.BeginInvoke".
Darkfirefighter Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 01.12.11 21:16 
Habe es jetzt anders gelöst, ich bin durch ein anderes Forum auf folgende Funktion gestoßen: SetThreadExecutionState
(pinvoke.net/default....dExecutionState.html)

Damit kann ich das Display einfach anfordern und um den Rest kümmert sich Windows.

Danke dennoch für die Hilfe :)