如何用C# 关闭显示器(监视器)

为了响应国家节约号召,

为国家电力贡献自己的一点微薄之力,

本人决定在吃饭及午休、外出时,

关闭显示器,

同时也延长了笔记本的使用寿命。。

当然在台式机上,直接关闭显示器电源即可。

在笔记本上,利用键盘的FN快捷键,只能关闭屏幕背光,

不能关掉主板给屏幕的信号输出。仔细看仍然会看到暗淡的桌面。

本人建议:各位不要经常性的让笔记本待机。。对硬盘影响很大的。。。

在桌面显示属性的“电源管理”里面,我们可以调整电源方案,

设置计算机在X分钟后关闭监视器,硬盘,待机。等等。。。

 

命令行为:

powercfg /change "电源方案名称" /moniter-timeout-ac 1

 

这个比较麻烦,还需知道当前使用的电源方案。

 

不过,windows为我们提供了一个API。可以实现即时关闭监视器。

 

LRESULT WINAPI SendMessage(
  __in  HWND hWnd,
  __in  UINT Msg,
  __in  WPARAM wParam,
  __in  LPARAM lParam
);

 

详见:http://msdn.microsoft.com/en-us/library/ms644950(VS.85).aspx

 

此API在平台调用中,如下签名:

//C# Signature:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

此方法的各个参数类型有一些重载,一般还是建议用IntPtr,否则,在64位平台OR其它情况下可能会崩溃~

 

我们需要传给Msg 一个系统消息,即:WM_SYSCOMMAND

然后是附加信息,比如屏幕保护:SC_SCREENSAVE,监视器电源:SC_MONITORPOWER

WM_SYSCOMMAND有如下取值:

enum SysCommands : int 
{
     SC_SIZE     = 0xF000,
     SC_MOVE     = 0xF010,
     SC_MINIMIZE     = 0xF020,
     SC_MAXIMIZE     = 0xF030,
     SC_NEXTWINDOW   = 0xF040,
     SC_PREVWINDOW   = 0xF050,
     SC_CLOSE    = 0xF060,
     SC_VSCROLL      = 0xF070,
     SC_HSCROLL      = 0xF080,
     SC_MOUSEMENU    = 0xF090,
     SC_KEYMENU      = 0xF100,
     SC_ARRANGE      = 0xF110,
     SC_RESTORE      = 0xF120,
     SC_TASKLIST     = 0xF130,
     SC_SCREENSAVE   = 0xF140,
     SC_HOTKEY       = 0xF150,
//#if(WINVER >= 0x0400) //Win95
     SC_DEFAULT      = 0xF160,
     SC_MONITORPOWER = 0xF170,
     SC_CONTEXTHELP  = 0xF180,
     SC_SEPARATOR    = 0xF00F,
//#endif /* WINVER >= 0x0400 */

//#if(WINVER >= 0x0600) //Vista
     SCF_ISSECURE    = 0x00000001,
//#endif /* WINVER >= 0x0600 */

/*
  * Obsolete names
  */
     SC_ICON     = SC_MINIMIZE,
     SC_ZOOM     = SC_MAXIMIZE,
}



于是有了下面的调用:

private const uint WM_SYSCOMMAND = 0x0112;
private const uint SC_MONITORPOWER = 0xF170;
//关闭
SendMessage(this.Handle,WM_SYSCOMMAND , (IntPtr)SC_MONITORPOWER,2);
//打开
SendMessage(this.Handle,WM_SYSCOMMAND , (IntPtr)SC_MONITORPOWER,-1);
希望大家在工作之余,可以为社会做点小小的贡献~

自己做好的小程序,可以锁屏后自动关屏:链接地址如下
C#实现自动锁屏+关屏

作者:一修先生
         
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2010-05-20 14:33  一修先生  阅读(6249)  评论(23编辑  收藏  举报