Daily Archives: 2007年03月18日

[分享]显示器休眠小程序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,即打开显示器。 … Continue reading

Posted in 软件 | 1 Comment