lanrenAPI 库:鼠标穿透、原始数据钩子和键盘映射
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():将字符串按指定分隔符分割成多个字符串。
使用方法:
- 将头文件和源文件添加到您的项目中。
- 在您的代码中创建 lanrenAPI 对象。
- 使用 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 表,添加了更多键盘按键的键名。
原文地址: https://www.cveoy.top/t/topic/ntIy 著作权归作者所有。请勿转载和采集!