LanrenAPI: C++ 类库用于处理鼠标键盘原始数据
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;
}
使用说明:
- 将头文件
lanrenapi.h包含到您的项目中。 - 在源文件中定义
keyMap变量。 - 使用
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: 初始版本发布。
感谢:
感谢所有为本类库贡献代码和建议的人员。
原文地址: https://www.cveoy.top/t/topic/ntIp 著作权归作者所有。请勿转载和采集!