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 来捕获键盘和鼠标消息。代码中包含了以下关键步骤:

  1. 注册 Raw Input 设备:在程序启动时,需要注册 Raw Input 设备,以确保能够接收键盘和鼠标消息。
  2. 处理 WM_INPUT 消息:当接收到 WM_INPUT 消息时,代码会解析消息内容,提取键盘或鼠标信息。
  3. 解析键盘消息:代码会解析键盘消息的按键码、消息类型(按键按下或松开)等信息。
  4. 解析鼠标消息:代码会解析鼠标消息的移动距离、按键状态等信息。

代码中还包含了一些额外的功能,例如记录按键按下时间、鼠标移动路径等。您可以在此基础上进行扩展,根据您的需求进行修改和完善。

Windows 键盘鼠标消息捕获与处理:C++ 代码示例

原文地址: https://www.cveoy.top/t/topic/nsK9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录