众所周知,可以用_kbhit()函数获取是否存在键盘活动;
众所还周知,_kbhit()只能适用于焦点位于控制台窗口的情况。
要判断windows系统下是否存在全局的键盘/鼠标活动(包括点击、移动和滚轮),可以使用win32提供的API:
getLastInputTime()。这个函数返回一个DWORD类型的值,表示最后一次用户输入的时间(以开机后经过了多少毫秒的形式表示)。
之后我们再用GetTickCount() 函数读取当前时间,与最后一次用户输入时间相减得到时间差。我们可以定义一个bool类型的函数,规定当时间差大于某值(比如30s),就认为用户目前没有在使用键盘或鼠标。
// 获取上次输入的时间
DWORD getLastInputTime() {
LASTINPUTINFO lii = { 0 };
lii.cbSize = sizeof(LASTINPUTINFO);
GetLastInputInfo(&lii);
return lii.dwTime;
}
// 检查30s内是否有键鼠活动
bool KMNotActive() {
// 获取当前时间和上次输入的时间
DWORD currentTime = GetTickCount();//自从启动以来经过的毫秒数
DWORD lastInputTime = getLastInputTime();
// 计算时间差
DWORD elapsedTime = currentTime - lastInputTime;
// 如果多于30s没有活动,认为用户暂离
return elapsedTime > 30000;
}
其中,LASTINPUTINFO是这样定义的:
typedef struct tagLASTINPUTINFO {
UINT cbSize; //结构体大小,以字节为单位
DWORD dwTime;//自开机以来经过的时间(毫秒)
} LASTINPUTINFO, *PLASTINPUTINFO;
cbSize,结构体的大小,其中cb的含义是count of bytes