为了防止室友偷偷用电脑学习,我用尽毕生所学写了一个检测鼠标键盘监测程序,实时监测室友的内卷情况。
该程序是用QT开发的,主要用到的技术是HOOK钩子、鼠标事件和键盘事件。该程序可以记录开机后,所有的键盘动作和鼠标动作(关机键除外),鼠标移动距离、系统开机时间、系统运行时间。基本防止了室友偷偷内卷。
下面是软件运行 的界面图:
该软件只要将键盘鼠标钩子部分写好,基本就能完成该程序的开发。钩子相关代码如下:
在这里插入代码片#include "hook.h"
#include<QDebug>
#include<QEvent>
#ifdef Q_OS_WIN
Hook::Hook()
{
}
static int wheelNum=0;
static int rightNum=0;
static int leftNum=0;
static int midNum=0;
static int mouseNum=0;
static int keyHookNum=0;
static int mouseX=0;
static int mouseY=0;
static HHOOK keyHook=nullptr;
LRESULT CALLBACK keyProc(int nCode,WPARAM wParam,LPARAM lParam)
{
KBDLLHOOKSTRUCT *pkbhs=(KBDLLHOOKSTRUCT*)lParam;
if(nCode == HC_ACTION)
{
keyHookNum++;
return 0;//返回1表示截取消息不再传递,返回0表示不作处理,消息继续传递
}
return CallNextHookEx(keyHook, nCode, wParam, lParam);
}
HHOOK mouseHook=NULL;
LRESULT CALLBACK mouseProc(int nCode,WPARAM wParam,LPARAM lParam )
{
if(nCode == HC_ACTION) //当nCode等于HC_ACTION时,要求得到处理
{
if(wParam==WM_MOUSEWHEEL)//滑轮
{
wheelNum++;
mouseNum++;
return 0;
}
if(wParam==WM_RBUTTONDOWN)//鼠标右键按下
{
rightNum++;
mouseNum++;
return 0;
}
if(wParam==WM_LBUTTONDOWN)//鼠标左键按下
{
leftNum++;
mouseNum++;
return 0;
}
if(wParam==WM_MBUTTONDOWN)//中键按下
{
midNum++;
mouseNum++;
return 0;
}
if(wParam==WM_MOUSEMOVE)//鼠标的移动
{
MOUSEHOOKSTRUCT *mhookstruct; //鼠标HOOK结构体
mhookstruct = (MOUSEHOOKSTRUCT*)lParam;
POINT pt = mhookstruct->pt; //将当前鼠标坐标点的x,y坐标作为参数向主程序窗口发送消息
mouseX=pt.x;
mouseY=pt.y;
return 0;
}
}
return CallNextHookEx(mouseHook,nCode,wParam,lParam);//否则,如果返回给下一个钩子子程处理
}
void Hook::installmouseHook()
{
mouseHook =SetWindowsHookEx( WH_MOUSE_LL,mouseProc,nullptr,0);//注册鼠标钩子
}
void Hook::unInstallHook()
{
if(keyHook!=nullptr)
{
UnhookWindowsHookEx(keyHook);//键盘钩子句不为空时销毁掉
keyHook=nullptr;
}
if(keyHook!=nullptr)
{
UnhookWindowsHookEx(keyHook);//键盘钩子句不为空时销毁掉
keyHook=nullptr;
}
}
int Hook::sendMouseSignal()
{
return mouseNum;
}
int Hook::sendWheelSignal()
{
return wheelNum;
}
int Hook::sendLeftSiganl()
{
return leftNum;
}
int Hook::sendRightSignal()
{
return rightNum;
}
int Hook::sendMidSignal()
{
return midNum;
}
void Hook::installHook()
{
keyHook =SetWindowsHookEx( WH_KEYBOARD_LL,keyProc,nullptr,0);
}
int Hook::sendSignal()
{
return keyHookNum;
}
int Hook::sendmouseX()
{
return mouseX;
}
int Hook::sendmouseY()
{
return mouseY;
}
#endif