监控系统是否空闲的三个方法-屏幕保护,显示器,键盘鼠标

屏保,关闭显示器,其实都是在鼠标键盘长时间不操作的情况下执行的功能。但既然要做就干脆3个都做吧。

首先是键盘鼠标是否空闲,从WIN2000开始就有了这样一个函数

BOOL GetLastInputInfo(      
    PLASTINPUTINFO plii
);
此函数只会获得最近一次操作的时间。所以具体输入的内容是获取不到滴!

其次是屏保信息的获得调用的是 SystemParametersInfo 函数。这个没有太多难度,一会直接贴代码。

然后是显示器是否开启。通过网上查资料发现有两个函数,分别是枚举显示器EnumDisplayMonitors和通过窗体获得显示器信息MonitorFromWindow。但不幸的这2个函数我都试了,与GetDevicePowerState函数的句柄需求不同。最后还是采用了CREATEFILE来打开串口。关于此,第一个参数也有讲究,CreateFile("\\.\LCD\" ...) 在XP上实验成功.还有个参数CreateFile("\\.\Display\"...)这在XP上实验失败,但根据网上的说法,此参数可以应用在其他系统中。

最后是代码,另需注意一点。在VC6.0的环境下一定要加个宏 #define _WIN32_WINNT 0x0500  越靠前越好,否则可能编译ERROR找不到函数定义。换句话说WIN2000以下的系统不能用这些函数。最后补充一句这三个函数都来自User32.dll。根据测试如果写成服务,在用户未登录的情况下通过以上三个方法都能检测到系统是否空闲。

ContractedBlock.gif ExpandedBlockStart.gif Code
        //是否进入屏保
        BOOL isActive = FALSE;   //一定是BOOL而不是bool否则运行时错误
        SystemParametersInfo(SPI_GETSCREENSAVERRUNNING,0,&isActive, 0);
        
if(isActive)
        {
            outfile
<<" SCREENSAVE ON ";
        }
        
else
        {
            outfile
<<" SCREENSAVE OFF ";
        }
        
//显示器是否关闭
        HANDLE hMonitor =     CreateFile("\\\\.\\LCD\\"
            GENERIC_WRITE 
| GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
        
if(GetDevicePowerState(hMonitor,&isActive))//如果发生错误 往往是句柄参数不正确导致的.
        {
            
if(isActive)
            {
                outfile
<<", MONITOR ON ";
            }
            
else
            {
                outfile
<<", MONITOR OFF ";
            }
        }
        
else
        {
            outfile
<<", MONITOR FAIL ";
        }
    
        
//检测输入是否空闲
        LASTINPUTINFO inputInfo;
        inputInfo.cbSize 
= sizeof(LASTINPUTINFO);
        GetLastInputInfo(
&inputInfo);
        DWORD timenow 
= GetTickCount();
        
if(timenow- inputInfo.dwTime > 5000//超过五秒就算空闲
        {
            outfile
<<", INPUT IDLE";
        }
        
else
        {
            outfile
<<", INPUT BUSY";
        }
        outfile
<<endl;

转载于:https://www.cnblogs.com/oplusx/archive/2009/10/22/1588275.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值