Schalten Sie den Monitor ein / aus

Ist es programmatisch möglich, einen Monitor über Code (C #) ein- / auszuschalten?

   

Hast du überhaupt versucht es zu googeln?

Erster Treffer: http://www.codeproject.com/KB/cs/Monitor_management_guide.aspx

Ich bin nicht überrascht, dass Sie einige von Windows gelieferte DLLs verwenden müssen.

(Ich vermutete, dass Sie eine C # -Lösung benötigten, da dies das einzige Tag war, das Sie anwendeten).

EDIT 8. Februar 2013:

Es wurde erwähnt, dass die Lösung unter Windows 7 und Windows 8 nicht mehr funktionierte. Nun, hier ist eine, die unter Windows 7 gut funktioniert, Windows 8 noch nicht ausprobiert hat.

http://cocoa.ninja/posts/Turn-off-your-monitor-in-Charp.html

namespace MonitorOff { public enum MonitorState { MonitorStateOn = -1, MonitorStateOff = 2, MonitorStateStandBy = 1 } public partial class Form1 : Form { [DllImport("user32.dll")] private static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam); public Form1() { InitializeComponent(); SystemEvents.SessionSwitch += SystemEvents_SessionSwitch; } void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e) { SetMonitorInState(MonitorState.MonitorStateOff); } private void button1_Click(object sender, EventArgs e) { SetMonitorInState(MonitorState.MonitorStateOff); } private void SetMonitorInState(MonitorState state) { SendMessage(0xFFFF, 0x112, 0xF170, (int)state); } } } 

Drücken Sie den Ein- / Ausschalter


Wenn Sie es in Code tun möchten, ist dies offenbar in der Win32-API möglich:

SendMessage hWnd, WM_SYSCOMMAND, SC_MONITORPOWER, param

Wobei WM_SYSCOMMAND = 0x112 und SC_MONITORPOWER = 0xF170 und param gibt den Modus an, in den der Monitor gestellt werden soll: -1: an 2: aus 1: Energiesparmodus

hWnd kann ein Handle für jedes Fenster sein – wenn Sie also ein Formular haben, sollte so etwas funktionieren

 int WM_SYSCOMMAND = 0x112; int SC_MONITORPOWER = 0xF170; [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); public static void Main(string[] args) { Form f = new Form(); bool turnOff = true; //set true if you want to turn off, false if on SendMessage(f.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)(turnOff ? 2 : -1)); } 

Notiz Ich habe das nicht wirklich versucht …

Die Antwort https://stackoverflow.com/a/713504/636189 oben funktioniert hervorragend zum Ausschalten eines Windows 7/8 Monitors, aber nicht zum Aufwachen. Auf diesen Systemen müssen Sie etwas Haschisches wie dieses tun (wie gefunden https://stackoverflow.com/a/14171736/636189 ):

 [DllImport("user32.dll")] static extern void mouse_event(Int32 dwFlags, Int32 dx, Int32 dy, Int32 dwData, UIntPtr dwExtraInfo); private const int MOUSEEVENTF_MOVE = 0x0001; private void Wake(){ mouse_event(MOUSEEVENTF_MOVE, 0, 1, 0, UIntPtr.Zero); Sleep(40); mouse_event(MOUSEEVENTF_MOVE, 0, -1, 0, UIntPtr.Zero); } 

Dieser Code kann zum Ein- und Ausschalten nützlich sein. Er funktionierte auch in Windows 7.

  private int SC_MONITORPOWER = 0xF170; private uint WM_SYSCOMMAND = 0x0112; [DllImport("user32.dll")] static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); enum MonitorState { ON = -1, OFF = 2, STANDBY = 1 } private void SetMonitorState(MonitorState state) { Form frm = new Form(); SendMessage(frm.Handle, WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)state); } 

Um die function aufzurufen, müssen Sie Folgendes tun:

 SetMonitorState(MonitorState.ON); 

ODER

 SetMonitorState(MonitorState.OFF); 

Hinweis: Dieser Code wurde in der WPF-Anwendung getestet. Mit den folgenden Namespaces:

 using System.Runtime.InteropServices; using System.Windows.Forms; 

Wer möchte diese functionalität in einer Konsolenanwendung?

 using System; using System.Runtime.InteropServices; using System.Timers; namespace TurnScreenOFF { class Program { private static int WM_SYSCOMMAND = 0x0112; private static uint SC_MONITORPOWER = 0xF170; public static void Main(string[] args) { SendMessage(GetConsoleWindow(), WM_SYSCOMMAND, (IntPtr)SC_MONITORPOWER, (IntPtr)2); } [DllImport("kernel32.dll")] static extern IntPtr GetConsoleWindow(); [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); } } 

Angepasst und getestet. 100% funktioniert unter Windows 8.

Ich konnte kein Kopierbeispiel finden, also habe ich selbst eine erstellt, vergessen Sie nicht, einen Verweis auf System.Windows.Forms hinzuzufügen.

 using System; using System.Runtime.InteropServices; using System.Threading; using System.Windows.Forms; namespace monitor_on_off { class Program { [DllImport("user32.dll")] static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll")] static extern void mouse_event(Int32 dwFlags, Int32 dx, Int32 dy, Int32 dwData, UIntPtr dwExtraInfo); private const int WmSyscommand = 0x0112; private const int ScMonitorpower = 0xF170; private const int MonitorShutoff = 2; private const int MouseeventfMove = 0x0001; public static void MonitorOff(IntPtr handle) { SendMessage(handle, WmSyscommand, (IntPtr)ScMonitorpower, (IntPtr)MonitorShutoff); } private static void MonitorOn() { mouse_event(MouseeventfMove, 0, 1, 0, UIntPtr.Zero); Thread.Sleep(40); mouse_event(MouseeventfMove, 0, -1, 0, UIntPtr.Zero); } static void Main() { var form = new Form(); while (true) { MonitorOff(form.Handle); Thread.Sleep(5000); MonitorOn(); Thread.Sleep(5000); } } } } 

Ich habe jede einzelne Methode durchgelesen, die jeder veröffentlicht hat, um einen Monitor in den Schlaf zu versetzen und ihn später zu einem anderen Zeitpunkt aufzuwecken. Zugegeben, SendMessage() funktioniert zwar mit Windows XP, weckt den Monitor jedoch nicht, nachdem der Monitor für eine SendMessage() den SendMessage() wurde. Ich habe versucht, C #, DOS, Skripte zum Spielen mit Power-Profilen und Powershell zu verwenden. Schließlich gab ich auf und ging zurück zum Anfang und mein erster Gedanke erwies sich als richtig. Sie müssen die PostMessage() nachdem der Monitor ausgeschaltet wurde, besser noch, sollten Sie immer PostMessage() ;


Der gesamte Code, den Sie zuvor gesehen haben, ist korrekt. Verwenden Sie stattdessen Folgendes:

 using System.Runtime.InteropServices; [DllImport("user32.dll")] static extern IntPtr PostMessage(int hWnd, int msg, int wParam, int lParam); PostMessage(-1, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF); 

Zu dieser Zeit der Ausführung und richtiger Arbeit (11. Mai 2015) laufe ich

  • Windows 7 Professional Version 6.1.7601 Service Pack 1 Build 7601
  • Visual Studio Professional 2013 Version 12.0.31101.00 Aktualisierung 4
  • .NET Framework 4.5.51209
  • C #

Mein System ist auf dem neuesten Stand.

Die Antwort mit dem wenigsten SLOC:

 using System; using System.Windows.Forms; using System.Runtime.InteropServices; static class Program { [DllImport("user32.dll")] static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam); [STAThread] static void Main() { SendMessage(new Form().Handle, 0x0112, 0xF170, 2); } }