2009-04-03 22 views
42

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

+2

"programmatisch" irgendwo Hinzufügen in Ihrer Frage, die Sie von dem downvotes .. speichern kann mein 2 Cent :-) – Newtopian

+0

mit oben Vereinbarte: obwohl dieser doesn Wenn ich den Preis "nette Frage" gewinne, stimme ich nicht mit so vielen Downvotes überein. Es ist tatsächlich eine gültige Frage. – Razzie

+2

Jeder denkt, dass sie klüger sind als das OP und kennt sein Problem. Vinoth fragte nicht, wie man es mit einem Knopf macht, er/sie fragte, ob es mit Code möglich wäre ... – Inisheer

Antwort

16

Drücken Sie die Ein-/Aus-Taste


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

Sendmessage hWnd, WM_SYSCOMMAND, SC_MONITORPOWER, param

wo WM_SYSCOMMAND = 0x112 und SC_MONITORPOWER = 0xF170 und param den Modus anzeigt, in den Monitor zu setzen: -1: auf 2: off 1: Energiesparmodus

hWnd ein Griff für jedes Fenster sein kann - also, wenn Sie ein Formular haben, so etwas wie dies sollte

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)); 
} 

Hinweis I haven arbeiten‘ t testete das tatsächlich ...

+1

Wenn der Strom aus ist, kann es zu dunkel sein, um zu sehen, auf/Aus-Taste, so dass Sie möglicherweise eine Taschenlampe für diese Bedingungen benötigen. –

+1

ich wollte sooo antworten, +1 :-) – Newtopian

+0

wenn das klappt, dann perfekte antwort! – Hugo

29

Hast du es überhaupt mal gegoogelt?

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

Ich bin nicht überrascht, dass Sie brauchen eine DLL von Windows-geliefert zu verwenden.

(Ich vermute, Sie brauchten eine C# -Lösung, weil das das einzige Tag ist, das Sie anwendeten).

EDIT 8. Februar 2013:

Es wurde erwähnt, dass die Lösung nicht mehr funktioniert unter Windows 7 en 8. Nun, hier ist eine, die gut unter Windows 7, habe nicht versucht Windows 8 noch funktioniert.

http://cocoa.ninja/posts/Turn-off-your-monitor-in-Csharp.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); 
     } 
    } 
} 
+1

Dieses Code-Projektbeispiel funktioniert nicht in Windows 7 oder 8. –

+0

Sie wissen, dass diese Antwort im Jahr 2009 gegeben wurde? –

+18

tue ich, aber da die Antwort in Google 2013 immer noch hochrangig ist, dachte ich mir, dass andere wie ich kommen werden, siehe das, und gehen Sie Download und versuchen Sie das Projekt, nur um zu entdecken, dass es nicht in Windows 2009-Betriebssystemen funktioniert. Ich habe versucht, ihnen die 10+ Minuten zu ersparen. Ich versuche in keiner Weise, den Wert, den Ihre Antwort hinzugefügt hat, wegzunehmen, ich bin mir sicher, dass es Tausenden von Menschen geholfen hat. Ich versuche nur, die Leute wissen zu lassen, dass sich etwas geändert hat. –

13

Die Antwort https://stackoverflow.com/a/713504/636189 über große Werke einen Windows 8.7-Monitor zum Abschalten, aber nicht für das Aufwachen. Auf diesen Systemen müssen Sie etwas hackish so (wie gefunden https://stackoverflow.com/a/14171736/636189) tun:

[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); 
} 
+0

Diese Lösung funktionierte unter Windows Vista mit zwei Monitoren hervorragend. –

+0

Nur 2 Cent, mouse_event funktioniert nicht, um MS Office Communicator im "aktiven" Status zu halten, nur Mausklick und keybd_event, also könnte es zukunftssicherer sein, diese zu benutzen oder die Maus mehr als ein Pixel zu bewegen, falls jemand denkt: "Wir sollten aufhören, Monitore einzuschalten, wenn jemand ihren Schreibtisch stößt." – Motes

+0

Akzeptierte Antwort funktionierte unter Windows 10 nicht für mich. Die angenommene Antwort würde den Bildschirm kurz einschalten, aber dann würde er wieder ausgehen. Dies war auf einem Surface Pro. Sobald ich diese Lösung implementiert habe, hat es super funktioniert. Hackish, ja, aber es funktioniert und das ist gut genug für die Mädchen, die ich verabrede! – jaredbaszler

8

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

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); 

    } 

Für die Funktion aufrufen müssen Sie tun:

SetMonitorState(MonitorState.ON); 

ODER

SetMonitorState(MonitorState.OFF); 

Hinweis: Dieser Code in WPF-Anwendung getestet.Mit den folgenden Namensräumen:

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

Denn wer will diese Funktionalität auf 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); 
    } 
} 

Adaptated und getestet. 100% funktioniert unter Windows 8.

+1

Es ist nicht notwendig, das GetConsoleWindow aufzurufen, und auch keine HWnd in einer Nicht-Konsolen-App, sondern stattdessen die HWND_BROADCAST-Nachricht (** SendMessage (New IntPtr (0xFFFF) ** ...). – ElektroStudios

3

Ich habe jede einzelne Methode durchgelesen, die jeder veröffentlicht hat, um einen Monitor in den Schlaf zu versetzen und später zu einem anderen Zeitpunkt aufzuwecken. Zugegeben, die SendMessage() funktioniert mit Windows XP, aber es weckt nicht den Monitor, nachdem der Monitor für eine gewisse Zeit ein Schlaf war. 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() verwenden, nachdem der Monitor ausgeschaltet wurde, besser noch, sollten Sie wahrscheinlich immer PostMessage();


So ist der gesamte Code, die Sie vor richtig gesehen haben, kann stattdessen die folgende:

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 diesem Zeitpunkt der Ausführung und Arbeits in geeigneter Weise (11. Mai 2015) Ich bin Lauf

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

Mein System ist auf dem neuesten Stand.

+0

Hallo @Mike Ich habe Ihre Lösung versucht und meine Monitore wurden schwarz, aber nach 1 Sekunde oder so leuchten sie wieder auf. Versucht mit PostMessage und SendMessage. (Windows 7 6.1.7601 x64) Irgendeine Idee? – ZeroDotNet

5

Ich konnte keine Kopie Beispiel einfügen, so dass ich selbst 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); 
      } 
     } 
    } 
} 
+0

Arbeitete für mich auf Fenster 10 64 Bit. Ich habe sogar einen kleinen nodejs Server erstellt, der es benutzt und jetzt kann ich die Bildschirme von meinem Handy abschalten. Vielen Dank. Nebenbei funktioniert die Öffnung auch, aber wenn ich den Schließbefehl ein zweites Mal ausführe, würde es sich öffnen das ist mir egal –

0

Die Antwort mit dem geringsten 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); 
    } 
} 
+1

IMHO nicht besser als die Antwort von klaasjan69 aus 2011. Es ist kürzer, aber weniger lesbar.Es beantwortet nur den "aus" -Fall, aber nicht den "on" -Fall.Ich sehe nicht "am wenigsten SLOC "als Vorteil. –

Verwandte Themen