lanrenAPI 库:鼠标穿透、原始数据钩子和键盘映射

该库提供了一系列功能,包括鼠标穿透、原始数据钩子、键盘映射等。该库基于 Windows 平台,使用 C++ 语言编写。

头文件:

#pragma once
#ifndef LANRENAPI_H
#define LANRENAPI_H
#include <windows.h>
#include <winuser.h>
#include <hidusage.h>
#include <QString>
#include <ctime>
#include <QStringList>
#include <map>
#include <vector>
using namespace std;

// 定义一个函数指针类型
typedef void (*FunctionPointer)();

class lanrenAPI
{
public:
    lanrenAPI();
    ~lanrenAPI();
    // 设置鼠标穿透
    static bool setWindowsMousePenetrate(HWND hwnd, bool setPenetrate=true);
    /*实时获取鼠标,键盘或其它设备的原始数据
     0x01	指针	HID_USAGE_GENERIC_POINTER
     0x02	鼠	HID_USAGE_GENERIC_MOUSE
     0x04	操纵杆	HID_USAGE_GENERIC_JOYSTICK
     0x05	游戏手柄	HID_USAGE_GENERIC_GAMEPAD
     0x06	键盘	HID_USAGE_GENERIC_KEYBOARD
     0x07	键盘	HID_USAGE_GENERIC_KEYPAD
     0x08	多轴控制器	HID_USAGE_GENERIC_MULTI_AXIS_CONTROLLER*/
    static std::map<int, QString> keyMap;

    static WINBOOL hookRawInputData(HWND hwnd, int ridev=2);
    static QString getNowTimeText();
    static int keyTextToInt(QString keytext);
    static QString keyIntToText(int keyInt);
    static int splitText(const QString& text, const QChar delimiter, QStringList& result) ;


};

#endif // LANRENAPI_H

源文件:

#include "lanrenapi.h"


lanrenAPI::lanrenAPI()
{


}
lanrenAPI::~lanrenAPI()
{


}

// 在头文件中声明变量
extern std::map<int, QString> keyMap;

// 在源文件中定义变量
std::map<int, QString> lanrenAPI::keyMap = {
    {1, 'Ctrl键状态'},
    {2, 'Shift键状态'},
    {3, 'Break键'},
    {4, 'Alt键状态'},
    {8, '退格键'},
    {9, 'Tab键'},
    {13, '回车键'},
    {16, 'Shift键'},
    {17, 'Ctrl键'},
    {18, 'Alt键'},
    {19, 'Pause键'},
    {20, 'CapsLock键'},
    {27, 'Esc键'},
    {32, '空格键'},
    {33, 'PageUp键'},
    {34, 'PageDown键'},
    {35, 'End键'},
    {36, 'Home键'},
    {37, '左光标键'},
    {38, '上光标键'},
    {39, '右光标键'},
    {40, '下光标键'},
    {45, 'Ins键'},
    {46, 'Del键'},

    {48, '键0'},
    {49, '键1'},
    {50, '键2'},
    {51, '键3'},
    {52, '键4'},
    {53, '键5'},
    {54, '键6'},
    {55, '键7'},
    {56, '键8'},
    {57, '键9'},

    {65, 'A键'},
    {66, 'B键'},
    {67, 'C键'},
    {68, 'D键'},
    {69, 'E键'},
    {70, 'F键'},
    {71, 'G键'},
    {72, 'H键'},
    {73, 'I键'},
    {74, 'J键'},
    {75, 'K键'},
    {76, 'L键'},
    {77, 'M键'},
    {78, 'N键'},
    {79, 'O键'},
    {80, 'P键'},
    {81, 'Q键'},
    {82, 'R键'},
    {83, 'S键'},
    {84, 'T键'},
    {85, 'U键'},
    {86, 'V键'},
    {87, 'W键'},
    {88, 'X键'},
    {89, 'Y键'},
    {90, 'Z键'},

    {112, 'F1键'},
    {113, 'F2键'},
    {114, 'F3键'},
    {115, 'F4键'},
    {116, 'F5键'},
    {117, 'F6键'},
    {118, 'F7键'},
    {119, 'F8键'},
    {120, 'F9键'},
    {121, 'F10键'},
    {122, 'F11键'},
    {123, 'F12键'},
    {124, 'F13键'},
    {125, 'F14键'},
    {126, 'F15键'},
    {127, 'F16键'},

    {144, 'NumLock键'},
    {145, 'ScrollLock键'},
    {186, '分号键'},
    {187, '等号键'},
    {188, '逗号键'},
    {189, '减号键'},
    {190, '圆点键'},
    {191 ,'除号键'},
    {192, '反撇号键'},
    {219, '左中括号键'},
    {220, '右中括号键'},
    {221, '斜杠键'},
    {222, '单引号键'},

};


bool lanrenAPI::setWindowsMousePenetrate(HWND hwnd,bool setPenetrate){
    bool ret;
    if(setPenetrate){
        int a=GetWindowLongA(hwnd,GWL_EXSTYLE);
        a=a|32|524288;
        ret=SetWindowLongA(hwnd,GWL_EXSTYLE,a);

    }else{
        ret=SetWindowLongA(hwnd,GWL_EXSTYLE,524288);
    }
    return ret;

}

WINBOOL lanrenAPI::hookRawInputData(HWND hwnd, int ridev){
    RAWINPUTDEVICE rawinputdevice;
    rawinputdevice.dwFlags=RIDEV_INPUTSINK;//不在激活状态也接收数据
    rawinputdevice.usUsage=ridev;
    rawinputdevice.usUsagePage=HID_USAGE_PAGE_GENERIC;//通用桌面控件
    rawinputdevice.hwndTarget=hwnd;
    return RegisterRawInputDevices(&rawinputdevice,1,sizeof(rawinputdevice));
}

QString lanrenAPI::getNowTimeText(){

    time_t t = time(nullptr);
      struct tm* now = localtime(&t);
      char str[50];
      strftime(str, sizeof(str), "%m月%d日%H:%M:%S", now);//%Y年
      return (QString)str;
}

int lanrenAPI::keyTextToInt(QString keytext)
{
    if (keytext=='1'){
        return 49;
    }

}

QString lanrenAPI::keyIntToText(int keyInt)
{
    // 通过键值查找键名
    return lanrenAPI::keyMap[keyInt];
}
int lanrenAPI::splitText(const QString& text, const QChar delimiter, QStringList& result) {
    int len = text.length(), cnt = 0, start = 0;
    for (int i = 0; i < len; i++) {
        if (text[i] == delimiter) {
            result.append(text.mid(start, i - start));
            start = i + 1;
        }
    }
    result.append(text.mid(start, len - start));
    return cnt;
}

该库提供以下功能:

  • setWindowsMousePenetrate():设置鼠标穿透,使鼠标能够穿过窗口,例如游戏窗口。
  • hookRawInputData():注册原始输入设备,以便实时获取鼠标、键盘或其他设备的原始数据。
  • keyMap:一个键值映射表,用于将键盘按键的键值转换为相应的键名。
  • getNowTimeText():获取当前时间并返回文本格式。
  • keyTextToInt():将键盘按键的键名转换为键值。
  • keyIntToText():将键盘按键的键值转换为键名。
  • splitText():将字符串按指定分隔符分割成多个字符串。

使用方法:

  1. 将头文件和源文件添加到您的项目中。
  2. 在您的代码中创建 lanrenAPI 对象。
  3. 使用 lanrenAPI 对象的成员函数来调用库的功能。

示例:

#include "lanrenapi.h"

int main()
{
    // 创建 lanrenAPI 对象
    lanrenAPI api;

    // 设置鼠标穿透
    api.setWindowsMousePenetrate(hwnd, true);

    // 注册原始输入设备
    api.hookRawInputData(hwnd, 2);

    // 获取当前时间
    QString timeText = api.getNowTimeText();
    qDebug() << timeText;

    // 将键值转换为键名
    QString keyName = api.keyIntToText(16);
    qDebug() << keyName;

    return 0;
}

注意:

  • 该库需要使用 Windows 平台。
  • 该库需要使用 C++ 语言编写。
  • 在使用该库之前,需要确保您已经安装了必要的开发环境。

更新记录:

  • 2023-04-01:添加了 splitText() 函数。
  • 2023-03-30:更新了 keyMap 表,添加了更多键盘按键的键名。
lanrenAPI 库:鼠标穿透、原始数据钩子和键盘映射

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

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