LanrenAPI: 鼠标键盘原始数据处理类库

头文件

#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"

// 定义 keyMap 变量
extern std::map<int, QString> lanrenAPI::keyMap;

lanrenAPI::lanrenAPI() {}

lanrenAPI::~lanrenAPI() {}

// 初始化 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;
}

使用说明:

  1. 将头文件lanrenapi.h包含到您的项目中。
  2. 在源文件中定义keyMap变量。
  3. 使用lanrenAPI类中的方法来获取鼠标键盘原始数据、设置鼠标穿透、获取当前时间文本等。

注意事项:

  • keyMap 变量应该在源文件中定义,并且在使用前确保初始化。
  • lanrenAPI 类中的方法需要在 Windows 平台上使用。

示例:

#include "lanrenapi.h"

int main() {
    // 获取当前时间文本
    QString timeText = lanrenAPI::getNowTimeText();
    qDebug() << "当前时间:" << timeText;

    // 设置鼠标穿透
    HWND hwnd = GetDesktopWindow();
    bool success = lanrenAPI::setWindowsMousePenetrate(hwnd, true);
    qDebug() << "设置鼠标穿透成功:" << success;

    return 0;
}

更多功能:

  • lanrenAPI 类库还提供了其他一些功能,例如获取鼠标坐标、按键状态等。
  • 您也可以根据自己的需求添加其他方法和功能。

联系方式:

如果您有任何问题或建议,请随时与我联系。

版权声明:

本类库采用 MIT 许可证。

更新日志:

  • 2023-10-27: 初始版本发布。

感谢:

感谢所有为本类库贡献代码和建议的人员。

LanrenAPI: C++ 类库用于处理鼠标键盘原始数据

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

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