Windows 键盘鼠标消息捕获与处理:C++ 代码示例
LRESULT CALLBACK MainWindow::func_Message(HWND hwnd,UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg==WM_INPUT){
UINT dwSize = 48;
LONGLONG inTime=0;
QString nowTimeText;
POINT lpPint;
// 第一次调用函数传NULL获取需要的缓冲区大小 已经知道了就直接填48
//GetRawInputData((HRAWINPUT)lParam, (UINT)RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));
//分配指定的缓冲区大小
LPBYTE lpbBuffer = new BYTE[dwSize];
// 取数据到缓冲区
GetRawInputData((HRAWINPUT)lParam, (UINT)RID_INPUT, (LPVOID)lpbBuffer, (PUINT)&dwSize, (UINT)sizeof(RAWINPUTHEADER));
RAWINPUT* rawdata = (RAWINPUT *)lpbBuffer;
qDebug() << '键盘数据到达' << rawdata->data.keyboard.Message << rawdata->data.keyboard.VKey << inTime;
if(rawdata->header.dwType==RIM_TYPEKEYBOARD){
inTime=updateIntervalKeyboard();
switch(rawdata->data.keyboard.VKey){
case(VK_F8):{
if(rawdata->data.keyboard.Message==WM_KEYUP){
if(isRec==false)
{
if(isRecall==true){
goto endCall;
}
//按下F8开始录制
isRec =true;
isRecall=false;
nowTimeText=lanrenAPI::getNowTimeText();
GetCursorPos(&lpPint);//获取当前鼠标相对于桌面的位置
if(isResetRec==false){
jbText=pThis->ui->pte_jb->toPlainText();
jbText+=jbText+'##'+nowTimeText+'##'+'\n鼠标初始 '+(char[])lpPint.x+' '+(char[])lpPint.y+'\n';
}
pThis->ui->pte_jb->setPlainText(jbText);
qDebug()<<jbText;
}
}
}
}
}else if(rawdata->header.dwType==RIM_TYPEMOUSE){
inTime=updateIntervalMose();
qDebug() << '鼠标数据到达' << rawdata->data.mouse.lLastX << rawdata->data.mouse.lLastY << rawdata->data.mouse.ulButtons << rawdata->data.mouse.ulExtraInformation << inTime;
}
}
endCall:
return CallWindowProcA (lpPrevWndFunc, hwnd, uMsg, wParam, lParam);
}
这段代码主要演示了如何使用 Raw Input API 来捕获键盘和鼠标消息。代码中包含了以下关键步骤:
- 注册 Raw Input 设备:在程序启动时,需要注册 Raw Input 设备,以确保能够接收键盘和鼠标消息。
- 处理 WM_INPUT 消息:当接收到 WM_INPUT 消息时,代码会解析消息内容,提取键盘或鼠标信息。
- 解析键盘消息:代码会解析键盘消息的按键码、消息类型(按键按下或松开)等信息。
- 解析鼠标消息:代码会解析鼠标消息的移动距离、按键状态等信息。
代码中还包含了一些额外的功能,例如记录按键按下时间、鼠标移动路径等。您可以在此基础上进行扩展,根据您的需求进行修改和完善。
原文地址: https://www.cveoy.top/t/topic/nsK9 著作权归作者所有。请勿转载和采集!