C++ 使用 GetRawInputData 获取鼠标键盘信息并保存

本文介绍了使用 GetRawInputData 获取鼠标和键盘信息,并将其保存到文本中。以下是实现代码,其中包含关键代码解析,并修正了示例代码中数据类型转换的错误。

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鼠标初始 ' + QString::number(lpPint.x) + ' ' + QString::number(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);
}

代码解析:

  1. 获取原始输入数据:

    • 使用 GetRawInputData 获取鼠标或键盘的原始输入数据,并将其存储到 RAWINPUT 结构体中。
  2. 处理键盘事件:

    • 当检测到键盘事件时,使用 switch 语句判断按键的 VKey,并根据不同的按键执行不同的操作。
    • 当按下 F8 键时,将开始录制鼠标和键盘操作,并将相关信息保存到文本中。
  3. 处理鼠标事件:

    • 当检测到鼠标事件时,获取鼠标的移动坐标、按钮状态等信息。
  4. 保存数据到文本:

    • 在录制过程中,将鼠标和键盘操作的信息保存到一个名为 jbText 的 QString 对象中,并将信息追加到 pte_jb 文本编辑框中。

修改说明:

  • 示例代码中使用了 QString::number() 函数将 lpPint.xlpPint.y 转换为字符串,以避免直接使用 (char[]) 方式进行数据类型转换,避免潜在的错误。

总结:

本文介绍了使用 GetRawInputData 获取鼠标键盘信息,并将其保存到文本中。代码示例详细说明了各个步骤,并对示例代码进行了修正。希望本文可以帮助您更好地理解和应用 GetRawInputData 函数。

更多内容:


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

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