GetLastInputInfo计时用户离开电脑及软件在指定时间锁定等

来自:https://blog.csdn.net/myiszjf/article/details/17757603

 

 GetLastInputInfo 计时键盘、鼠标处于空闲状态的时间,不清楚计时其他电脑I/O设备的空闲状态不? 
  所以呢,这个函数使用方面很广,可以计时用户离开电脑之后的延展作用,比如屏保和当用户离开时软件自动锁定。我在网上找到一个源码,实现软件在用户未操作电脑到时后自动锁定,见下文: 

/************************************************************************/
/* 说明:
调用函数GetLastInputInfo()以后, 结构成员lpi.dwTime 中的值并非上次输入事件
发生以后的毫秒数。而是上次输入事件发生时的系统运行时间。相当于上次输入事件
发生时执行了lpi.dwTime=::GetTickCount()。
::GetTickCount()-lpi.dwTime才是上次输入事件发生以后的毫秒数。
*/
/************************************************************************/
//注意:windows2000以上系统才支持函数GetLastInputInfo()因此有可能需要在StdAfx.h中加上如下语句:
#define _WIN32_WINNT 0x0500
//或者:
#ifdef _WIN32_WINNT 
#undef _WIN32_WINNT 
#endif 
#define _WIN32_WINNT 0x0500 

//首先定义一个计时器计时事件的定义
#define  GETLASTINPUTINFO  109

//然后写一个Time计时器(具体计时器的生成步骤就不在叙述)

//1、在程序初始化的时候调用
m_uGetLastInputInfo = SetTimer(GETLASTINPUTINFO, 500, NULL);//设置获取键盘和鼠标处于空闲状态的时间的计时器


//2、处理函数
void CNetAppSoftDlg::OnTimer(UINT nIDEvent)
{
    LASTINPUTINFO lpi;
    DWORD dwTime = 0;

    switch(nIDEvent)
    {
    case GETLASTINPUTINFO://zhouzx 获取键盘和鼠标处于空闲状态的时间

        lpi.cbSize = sizeof(lpi);
        GetLastInputInfo(&lpi);//关于此windows API接口的介绍,参见同文件夹下的文档
        dwTime = ::GetTickCount()-lpi.dwTime;

        if (dwTime >= 30000)//30秒
        {
            if (m_uGetLastInputInfo)
            {
                KillTimer(GETLASTINPUTINFO);
            }
            OnBnClickedButtonLock();
        }
        break;
    default:
        break;
    }
    CDialog::OnTimer(nIDEvent);
}

//3、在软件解锁后的地方重新开始新的计时
m_uGetLastInputInfo = SetTimer(GETLASTINPUTINFO, 500, NULL);

//4、在推出软件的时候,如果计时器没有停止,要关闭计时器
if (m_uGetLastInputInfo)
{
    //结束获取键盘和鼠标处于空闲状态的时间定时器
    KillTimer(GETLASTINPUTINFO);
}

提醒一下,对于计时器一定要注意释放资源,killtimer多调用几次没有关系,程序不会崩溃。调用了N次Settimer,就得调用>=N次Killtimer。
  我之前在一家公司实习,写了一个模块,功能是传递一个句柄,然后监视用户对这个句柄所代表的窗体未操作计时,时间到达指定数值后执行预设操作。如果句柄为一个窗体,而窗体里面还有子窗体(包括控件),若是对子窗体操作,那么也算是对指定句柄窗体的操作,这时不会计时。当操作指定句柄窗体的同级窗体或父窗体,那么计时会生效。当然,这个也包括用户离开电脑的计时。因为不涉及机密,所以我就把源码放在下面。使用方法是用类生成一个对象,然后用对象CreateWindow创建一个隐藏窗体,利用这个隐藏窗体监视指定句柄窗体,当然我不太清楚我这个类的使用开销是如何的,欢迎指教,预设操作用回调函数实现。可自行修改回调函数接口。
  源码下载:http://dl.dbank.com/c0a3db1dhg
posted @ 2020-10-11 11:02  宇宙之外  阅读(276)  评论(0编辑  收藏  举报