打开/closures显示器

通过代码(C#)打开/closures监视器是否可以编程?

你甚至尝试使用Googlesearch吗?

首先点击: http : //www.codeproject.com/KB/cs/Monitor_management_guide.aspx

我不惊讶你需要使用Windows提供的一些DLL。

(我猜你需要一个C#解决scheme,因为这是你应用的唯一标签)。

编辑2013年2月8日:

有人提到,该解决scheme不再在Windows 7中工作8.这里是一个在Windows 7下很好地工作,还没有尝试过Windows 8。

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

按开/关button


如果你想在代码中做到这一点,显然这是在Win32 API中可能的:

SendMessage hWnd,WM_SYSCOMMAND,SC_MONITORPOWER,param

其中WM_SYSCOMMAND = 0x112和SC_MONITORPOWER = 0xF170,param指示将监视器置于的模式:-1:开启2:closures1:节能模式

hWnd可以是任何窗口的句柄 – 所以如果你有一个窗体,像这样的东西应该工作

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

注意我没有实际试过这个…

上面的回答https://stackoverflow.com/a/713504/636189很适合closuresWindows 7/8监视器,但不能唤醒它。 在这些系统上,你需要做一些这样的事情(如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); } 

此代码可以用于打开和closures..它也在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); } 

为了调用这个函数,你必须这样做:

 SetMonitorState(MonitorState.ON); 

要么

 SetMonitorState(MonitorState.OFF); 

注意:此代码在WPF应用程序中进行了testing。 使用下面的命名空间:

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

谁想要在控制台应用程序上使用此function:

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

适应和testing。 100%在Windows 8上工作。

我找不到复制粘贴示例,所以自己创build了一个,不要忘记添加对System.Windows.Forms的引用。

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

我已经经历了每个人都发表过的每一种方法,让监视器睡觉,并在稍后的时间唤醒。 当然, SendMessage()可以在Windows XP下工作,但在显示器睡眠了一段时间之后,它不会唤醒显示器。 我曾尝试使用C#,DOS,用于播放电源configuration文件的脚本和Powershell。 最终我放弃了,回到了开始,我的第一个想法被certificate是正确的。 在closures监视器之后,您需要使用PostMessage() ,但是您应该始终使用PostMessage()


所以你以前看过的所有代码都是正确的,而是使用下面的代码:

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

在这个执行和适当的工作(2015年5月11日)我正在运行

  • Windows 7 Professional版本6.1.7601 Service Pack 1 Build 7601
  • Visual Studio Profesional 2013版本12.0.31101.00更新4
  • .NET Framework 4.5.51209
  • C#

我的系统是完全最新的。

SLOC最less的答案是:

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