Laden...

Bildschirm auf Windows10 (1511) via Software ein- und ausschalten

Erstellt von PoWl vor 7 Jahren Letzter Beitrag vor 6 Jahren 2.032 Views
P
PoWl Themenstarter:in
219 Beiträge seit 2008
vor 7 Jahren
Bildschirm auf Windows10 (1511) via Software ein- und ausschalten

Hi,

für mein Cloud-Bilderrahmen Projekt, welches ein Windows10 (1511) Tablet als Basis verwenden soll muss ich den Bildschirm per Software ein- und ausschalten können.

Hierfür habe ich ein Codeschnipsel im Internet gefunden, welches mir den Bildschirm ein- und wieder ausschaltet.


        [DllImport("user32.dll")]
        static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);

        private void button1_Click(object sender, EventArgs e)
        {
            SendMessage(this.Handle, 0x0112, 0xF170, 2);
            timer1.Enabled = true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            SendMessage(this.Handle, 0x0112, 0xF170, -1);
            timer1.Enabled = false;
        }

Das funktioniert auch, leider gibt es dabei noch ein paar Probleme. Wenn der Connected-Standby aktiv ist dann geht der Bildschirm aus und das Tablet geht ungewollt in den Connected-Standby über, was dazu führt, dass die Ausführung des Programms stoppt und das Tablet nicht wieder aufwacht. Da ich den Connected-Standby nicht unbedingt benötige, habe ich ihn einfach deaktiviert (über die Registry) und neu gestartet. Jetzt schaltet sich der Bildschirm nach der eingestellten Timerzeit zuverlässig auf. Jedoch direkt danach schaltet sich der Bildschirm wieder ab, ohne ersichtlichen Grund?! Zudem ist währenddessen der Touchscreen empfindlich geschaltet. Sobald man ihn berührt geht der Bildschirm wieder an. Das ist nicht unbedingt schlimm aber ich wünschte ich hätt eine Möglichkeit, das abzuschalten.

Hat jemand eine Idee was das soll und wie man das Problem lösen könnte? 🙁

Auf meinem Windows 7 Rechner funktioniert es wie geplant und der Bildschirm bleibt an.

Mein zweites Windows10Pro (1607) Tablet geht komischer weise nicht in den Connected Standby. Dafür begrüßt mich nach dem Wiedereinschalten des Bildschirms in gewohnter Manier der dämliche Sperrbildschirm und direkt danach schaltet sich auch hier der Bildschirm wieder von alleine aus.

Ich habe noch eine weitere Methode gefunden. Diese bewegt zum Aufwecken einfach kurz den Mauszeiger:

        [DllImport("user32.dll")]
        static extern void mouse_event(Int32 dwFlags, Int32 dx, Int32 dy, Int32 dwData, UIntPtr dwExtraInfo);

        private void timer1_Tick(object sender, EventArgs e)
        {
            mouse_event(0x0001, 0, 1, 0, UIntPtr.Zero);
            Thread.Sleep(40);
            mouse_event(0x0001, 0, -1, 0, UIntPtr.Zero);
            timer1.Enabled = false;
        }

Hier bei geht der Bildschirm nach dem Aufwecken nicht wieder von alleine aus. Allerdings ist dann der Mauszeiger sichtbar, und das soll auf Touchscreens auch nicht sein, dass der dann plötzlich dort auftaucht.

Es ist echt verzwickt. Ich frage mich, warum Windows einem da so Steine in den Weg legt 🙄

D
261 Beiträge seit 2015
vor 7 Jahren

Also das mit dem Mauszeiger mach ich genauso, nur das ich einfach das Mausicon für die komplette Applikation ausgeblendet habe. Somit stört er auch nicht wenn das Gerät aufwacht.

Mouse.OverrideCursor = Cursors.None;

Aber seit dem Anniversary Update wacht mein Tablet jetzt gar nicht mehr auf, wenn der Monitor via SC_MONITORPOWER (0xF170) ausgeschaltet wurde.

Den Registry-Eintrag für den Connected Standby hab ich schon probiert. Hilft leider auch nichts.

D
261 Beiträge seit 2015
vor 6 Jahren

Hierzu habe ich eine Lösung gefunden:

Es kann mit Power Availability Requests gearbeitet werden. (siehe C#: Windows Standby unterdrücken)

Ich verwende für meine Anwendung, welche in der Nacht den Bildschirm ausschaltet, den Power Request Type "PowerRequestExecutionRequired". Ich musste dann noch zusätzlich den Connected Standby ausschalten, sonst wurde das Gerät nach längeren Zeiträumen mit dem Bildschirm aus, trotzdem in den Standby versetzt.

Ich bin mir nicht ganz sicher ob ich den korrekten Modus gewählt habe. Eventuell geht es auch ohne das Deaktivieren des Connected Standby.
Wie die verschiedenen Modi gewählt werden sollten, steht hier MSDN - PowerSetRequest function (Windows).