首页 > 其他分享 >鼠标键盘游戏手柄的测试代码

鼠标键盘游戏手柄的测试代码

时间:2024-12-05 22:37:41浏览次数:4  
标签:鼠标 手柄 mouse raw arg 测试代码 rid data lbl

#include "QtWidgetsApplication2.h"
#include <windows.h>
#include <QDebug>
#include <QVBoxLayout>

QtWidgetsApplication2::QtWidgetsApplication2(QWidget *parent)
    : QFrame(parent)
{
    ui.setupUi(this);
	//init();
}

QtWidgetsApplication2::~QtWidgetsApplication2()
{}


void QtWidgetsApplication2::init()
{
	//setFixedSize(800, 600);

	QFrame* frame_conetent = new QFrame(this);
	frame_conetent->setMinimumSize(1024, 768);
	frame_conetent->show();
	//frame_conetent->setStyleSheet("background-color:#ff0000;");

	


	QVBoxLayout* layout = new QVBoxLayout();
	layout->setMargin(10);
	layout->setSpacing(16);
	frame_conetent->setLayout(layout);

	

	for (int i = 0; i < 15; i++) {
		lbl_list[i] = new QLabel();
		lbl_list[i]->setStyleSheet("font:24px bold;");
		lbl_list[i]->setText(QString("Label %1").arg(i));
		
		layout->addWidget(lbl_list[i]);
		
	}
	lbl_mouse = new QLabel();
	lbl_mouse->setStyleSheet("font:24px bold;");
	layout->addWidget(lbl_mouse);

	lbl_key = new QLabel();
	lbl_key->setStyleSheet("font:24px bold;");
	layout->addWidget(lbl_key);

	m_hWnd = (HWND)this->winId();

	RegisterGamePadDevice();
	RegisterMouseDevice();
	RegisterKeyboardDevice();
}


/*
* 0x01	指针	HID_USAGE_GENERIC_POINTER
0x02	鼠标	HID_USAGE_GENERIC_MOUSE
0x04	游戏杆	HID_USAGE_GENERIC_JOYSTICK
0x05	Game Pad	HID_USAGE_GENERIC_GAMEPAD
0x06	键盘	HID_USAGE_GENERIC_KEYBOARD
0x07	键盘	HID_USAGE_GENERIC_KEYPAD
0x08	多轴控制器	HID_USAGE_GENERIC_MULTI_AXIS_CONTROLLER
*/

bool QtWidgetsApplication2::RegisterMouseDevice() {
	RAWINPUTDEVICE rid;
	rid.usUsagePage = 0x0001;
	rid.usUsage = 0x0002;  // mouse device
	rid.dwFlags = RIDEV_DEVNOTIFY | RIDEV_INPUTSINK;
	rid.hwndTarget = m_hWnd;
	return ::RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE)) == TRUE;
}

bool QtWidgetsApplication2::RegisterKeyboardDevice() {
	RAWINPUTDEVICE rid;
	rid.usUsagePage = 0x0001;
	rid.usUsage = 0x0006;  // keyboard device
	rid.dwFlags = RIDEV_DEVNOTIFY | RIDEV_INPUTSINK;
	rid.hwndTarget = m_hWnd;
	return ::RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE)) == TRUE;
}

//0x05	Game Pad	HID_USAGE_GENERIC_GAMEPAD
bool QtWidgetsApplication2::RegisterGamePadDevice()
{
	
	RAWINPUTDEVICE rid;
	rid.usUsagePage = 0x0001;
	rid.usUsage = 0x0005;  // gamepad device		
	rid.dwFlags = RIDEV_DEVNOTIFY | RIDEV_INPUTSINK;
	rid.hwndTarget = m_hWnd;
	return ::RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE)) == TRUE;
}

bool QtWidgetsApplication2::nativeEvent(const QByteArray& eventType, void* message, long* result)
{
	MSG* msg = static_cast<MSG*>(message);
	if (msg->message == WM_INPUT)
	{
		//qDebug() << "接收到WM_INPUT消息(通过nativeEvent)";
		UINT dwSize;
		GetRawInputData((HRAWINPUT)msg->lParam, RID_INPUT, NULL, &dwSize, sizeof(RAWINPUTHEADER));
		LPBYTE lpb = new BYTE[dwSize];
		if (lpb == NULL)
		{
			return false;
		}
		if (GetRawInputData((HRAWINPUT)msg->lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER)) != dwSize)
		{
			delete[] lpb;
			return false;
		}
		RAWINPUT* raw = (RAWINPUT*)lpb;
		if (raw->header.dwType == RIM_TYPEMOUSE)
		{
			//qDebug() << "鼠标原始输入(通过nativeEvent):X=" << raw->data.mouse.lLastX << " Y=" << raw->data.mouse.lLastY;
			lbl_mouse->setText(QString("X=%1 Y=%2 ulRawButtons=%3 ulButtons=%4 usFlags=%5 usButtonData=%6")
				.arg(raw->data.mouse.lLastX).arg(raw->data.mouse.lLastY)
				.arg(raw->data.mouse.ulRawButtons).arg((USHORT)raw->data.mouse.ulButtons)
				.arg(raw->data.mouse.usFlags).arg(raw->data.mouse.usButtonData)
			);
		}
		else if (raw->header.dwType == RIM_TYPEKEYBOARD)
		{
			//qDebug() << "键盘原始输入(通过nativeEvent):虚拟键码=" << raw->data.keyboard.VKey;
			
			lbl_key->setText(QString("VKey=%1 MakeCode=%2 Flags=%3 Message=%4 Reserved=%5 ExtraInformation=%6" )
				.arg(raw->data.keyboard.VKey).arg(raw->data.keyboard.MakeCode)
				.arg(raw->data.keyboard.Flags).arg(raw->data.keyboard.Message)
				.arg(raw->data.keyboard.Reserved).arg(raw->data.keyboard.ExtraInformation)
			);
		}
		if (raw->header.dwType == RIM_TYPEHID)
		{
			int total_size = raw->data.hid.dwSizeHid * raw->data.hid.dwCount;
			for (int i = 0; i < 15; i++) 
			{
				lbl_list[i]->setText(QString("%1:%2").arg(i + 1).arg(raw->data.hid.bRawData[i]));
				
			}

		}
		delete[] lpb;
	}
	return QWidget::nativeEvent(eventType, message, result);
}

标签:鼠标,手柄,mouse,raw,arg,测试代码,rid,data,lbl
From: https://www.cnblogs.com/thinkinc999/p/18589550

相关文章

  • HS6621Cx 一款低功耗蓝牙SoC芯片应用于键盘、鼠标和遥控器消费
    HS6621Cx是一款功耗优化的真正片上系统(SOC)解决方案,适用于低功耗蓝牙和专有2.4GHz应用。它集成了高性能、低功耗射频收发器,具有蓝牙基带和丰富的外设IO扩展。HS6621Cx还集成了电源管理功能,可提供高效的电源管理。它面向2.4GHz蓝牙低功耗系统、专有2.4GHz系统、人机接口设备(键盘......
  • 如何使用css实现鼠标跟随?
    在CSS中,无法直接实现真正的鼠标跟随效果。CSS主要用于样式和布局,而鼠标跟随需要JavaScript来处理鼠标事件和元素定位。以下是结合CSS和JavaScript实现鼠标跟随效果的几种常见方法:1.使用JavaScript和position:absolute;这是最常用的方法。JavaScript监听鼠标移动......
  • 你是如何测试代码的性能的?都有用到哪些工具?
    作为大型语言模型,我不会直接“运行”或“测试”代码,但我可以提供关于前端代码性能测试方法和工具的信息,并帮助你理解如何使用它们。前端性能测试主要关注以下几个方面:加载性能:页面加载速度有多快?运行时性能:页面交互有多流畅?动画是否卡顿?内存使用:页面消耗多少内存?是......
  • 游戏防检查之易语言鼠标轨迹算法 - 模拟人工轨迹
    一.简介鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。鼠标轨迹算法的底层实现采用C/C++语言,原因在于C/C++提供了高性能的执行能力和直接访问操作系统底层资源的能力。鼠标轨迹算法具有以下优势:模拟人工轨迹:算法能够模拟出非贝塞尔曲线......
  • 游戏防检查之C++鼠标轨迹算法 - 模拟人工轨迹
    一.简介鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。鼠标轨迹算法的底层实现采用C/C++语言,原因在于C/C++提供了高性能的执行能力和直接访问操作系统底层资源的能力。鼠标轨迹算法具有以下优势:模拟人工轨迹:算法能够模拟出非贝塞尔曲线......
  • 写一个让一句话随着鼠标移动的小插件
    //创建一个div元素来容纳文本constfloatingText=document.createElement('div');floatingText.style.position='fixed';//使其相对于视口定位floatingText.style.pointerEvents='none';//避免干扰鼠标事件floatingText.textContent='这是一句会跟随鼠标移动的......
  • 使用js获取鼠标坐标
    //获取鼠标坐标有两种主要方式,取决于你想获取相对于什么位置的坐标://1.相对于视口(viewport)的坐标:document.addEventListener('mousemove',function(event){constx=event.clientX;consty=event.clientY;//使用x和y坐标,例如显示在页面上consol......
  • 滑动验证码之鼠标移动轨迹绘制分析
    Part1鼠标事件类型这些是JavaScript中与鼠标事件相关的常见事件类型。具体介绍如下:auxclick:表示鼠标的辅助按键被点击。辅助按键包括鼠标中键和右键。click:表示鼠标单击操作被触发。dblclick:表示鼠标双击操作被触发。mousedown:表示鼠标按下操作被触发。mouseup:表示鼠标......
  • 简单实用的鼠标滑过图片遮罩层动画jQuery插件
    nsHover是一款简单实用的鼠标滑过图片遮罩层动画JQUERY插件。该插件可以在图片或块级元素上制作鼠标滑过时的遮罩层动画效果,它可以设置遮罩层的前景色和背景色,可以制作圆形图片等,非常实用。在线演示  下载 使用方法使用该鼠标滑过插件需要引入jQuery和ns.hover.min.js文......
  • Python 使用shapely、geopandas、matplotlib绘制全国各个省份2023年GDP热力图,鼠标点击
    以下是一个示例代码,用于在使用matplotlib和geopandas绘制地图并设置区域后,当鼠标点击地图上的某个区域时,返回该区域的名称。首先,确保你已经安装了matplotlib、geopandas和descartes库(descartes库用于在matplotlib中绘制地理空间数据)。如果没有安装,可以通过pipinstallmatplot......