[分享]显示器休眠小程序SpMonitor及其原理

经常临时外出,不能关闭主机又恐频繁硬开关对显示器寿命不利,而每次老去系统的电源选项定义休眠时间太麻烦。最后我在Pcshow的BBS上搜索到下面这个帖子和SpMonitor这个小程序解了我的燃眉之急:http://itbbs.pcshow.net/viewthread.php?action=printable&tid=350877710
需要的朋友可以点击这里下载,对于此程序的原理我网上搜遍了仍不得其解,于是我去信请教”下雪了”(Chen Snowing),他本人回复如下:
=================================================
一些概念的解释
API函数:
API的英文字面意思是“应用程序接口”,它是一些实现某种功能的小的子程序。
例如MessageBox函数,它就是用来显示一个提示框的,如果某个程序要弹出一个提示框,只要在代码中调用这个MessageBox函数就行了。
同数学上的函数有参数一样(如y=f(x), x就是这个函数的参数),计算机编程中的函数也有参数。
比如这个MessageBox函数,它有4个参数,其中第二个参数定义了提示框的提示文本,第三个参数定义了提示框的标题栏。

消息:
消息这个概念可能有点抽象,和“消息”这两个字的字面意思差不多。
比如说,在一个窗口上移动了一下鼠标,此时,就会产生消息——鼠标移动了的消息。
又比如,单击了一个按钮,此时也会产生消息——按钮被按下的消息。
与现实生活中的信件有发送者和接收者一样,计算机中的消息也有发送者和接收者,这个我们现在可以不去深究。
同上面提到的函数一样,消息也有参数。例如WM_MOUSEMOVE消息,这个消息就会在移动鼠标时产生,这个 WM_MOUSEMOVE消息有一个参数就包含了鼠标的坐标值。

===================================================
至于如何让显示器休眠,很简单,用SendMessage函数发一条带SC_MONITORPOWER和1参数的WM_SYSCOMMAND消息。

先说SendMessage函数:
这个函数别的不干,是专门用来发送消息的,也就是说,SendMessage函数充当了一个消息发送者的角色。
SendMessage函数共有四个参数:
第一个指定了要把消息发送给谁,即消息的接收者;
第二个指定了要发送的消息的名称,即要发送什么消息;
第三、第四个指定了要发送消息的消息参数。

WM_SYSCOMMAND消息:
从字面上来看,SYS应该是指“系统”,COMMAND是“命令”的意思,那么这个WM_SYSCOMMAND可以简单的理解为“系统命令”消息。
这个WM_SYSCOMMAND消息可以做很多事情,具体做什么由消息参数决定,如参数为SC_MONITORPOWER就是控制显示器的。

=======================================================
在我的程序中,是这么写的:
SendMessage(hWin,WM_SYSCOMMAND,SC_MONITORPOWER,1)
其中,hWin就是消息的接收者,这里我们不去管它。
后面的“WM_SYSCOMMAND,SC_MONITORPOWER,1”连在一起的意思就是使显示器进入低功耗状态。
你应该注意到后面的数字1,根据微软的相关文档,这里可以是1、2或者-1。
1就是使显示器处于低能耗状态,2应该是关闭显示器,但我这里试验两者效果一样,没看出什么区别。
-1就是打开显示器。

======================================================
来做一些试验吧:
用WinHex之类的十六进制编辑软件打开程序文件SpMonitor.exe,定位到偏移地址为0066C处,这里的十六进制值应该是01,这就是参数的值了,你把它改成02后保存运行看看是什么反应。如果要使参数为-1,就改成FF,即打开显示器。
在试验-1时有些麻烦,你先要让显示器休眠,在用程序打开,这样才能看出结果。
而且,因为我这个程序是只能运行一个实例的(即不能同时运行两个),所以还要把这段代码给屏蔽掉,方法是将偏移地址为00429的747C改成9090
接下来你可以先运行参数为1的程序,在显示器关闭前再运行参数为-1的程序,稍后你就会看到,显示器先被关了,然后又自动打开了。
======================================================

这里再次感谢“下雪了”(Chen Snowing)的热心解答!

This entry was posted in 软件. Bookmark the permalink.

One Response to [分享]显示器休眠小程序SpMonitor及其原理

  1. 鱼肉丸 says:

    呵呵,我经常用电脑听音乐,自己在一遍看书做做事情,开关显示器实属正常……每天不下20次,想想我的显示器也用了7年了,久经考验了。应该保养保养了^_^

发表评论

您的电子邮箱不会被公开。 标记为 * 的区域必须填写

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>