DirectInput手柄在Windows环境下震动实现

DirectInput手柄Windows环境下震动实现

  • 背景
  • 1.direcrInput手柄震动控制
    • 1.1运行环境
    • 1.2代码实现
  • 2 模拟XInput设备,通过XInput实现
    • 2.1 x360ce设置
  • 2.2 XInput 代码实现
    • 2.3 x360ce分析

背景

近期项目里面有个需求,需要在控制终端上安装摇杆,且需要通过震动反馈设备的某些重要运行状态。自以为机智的自己在万能的某宝买了一个飞行摇杆,带震动反馈,DInput接口,结果是踩坑的开始。
Windows下手柄分为两类,XInput和DirectInput,XInput主要是Xbox系列手柄,比较贵,亲儿子;市面上大多杂牌的手柄都只支持DirectInput。查阅官方文档:xinput and directinput 心凉了半截:The vibration effects will not be available,意思就是directinput不再支持手柄震动了。不过directInput有一个directInputEffect,从文档看是力反馈,论坛说也能拿来做震动,因此先用directInput做一下尝试。

1.direcrInput手柄震动控制

1.1运行环境

环境搭建就不再赘述,主要就是选一个win10的tool kit,已经集成了directx。Qt是项目中用于界面搭建的环境。
(1)windows 10 1903
(2)Qt 5.9

1.2代码实现

github 上有比较完整的 QGameController,能够实现手柄的识别、各参数的读取,封装比较完整,但是没有手柄震动的驱动。本着不重复造轮子的原则,从这个开源项目开始进行代码实现。

    DWORD dwAxisX = DIJOFS_X;  //一个震动电机LONG lDirecX = 0;DIPERIODIC diPeriodic;      ZeroMemory(&diPeriodic, sizeof(DIPERIODIC));DICONSTANTFORCE diConstantForce;ZeroMemory(&diConstantForce, sizeof(DICONSTANTFORCE));DIEFFECT   diEffect;        // general parameters// set up the effect structure itselfdiEffect.dwSize = sizeof(DIEFFECT);diEffect.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;diEffect.dwDuration = (DWORD) INFINITE; diEffect.dwStartDelay = 0;// set up details of effectdiEffect.dwSamplePeriod = 0;               diEffect.dwGain = lVibraStrength;      diEffect.dwTriggerButton = DIEB_NOTRIGGER;// connect effect to trigger buttondiEffect.dwTriggerRepeatInterval = 0;diEffect.cAxes = 1;diEffect.rgdwAxes = &dwAxisX;diEffect.rglDirection = &lDirecX;diEffect.lpEnvelope = 0;diConstantForce.lMagnitude = DI_FFNOMINALMAX;diEffect.cbTypeSpecificParams = sizeof(DICONSTANTFORCE);diEffect.lpvTypeSpecificParams = &diConstantForce;// create the effect and get the interface to ithr = g_pJoystick->CreateEffect(GUID_ConstantForce,  // standard GUID&diEffect,      // where the data is&lpdieffect,    // where to put interface pointerNULL);          // no aggregationif(FAILED(hr)){qDebug()<< "create effect failed";}g_pJoystick->SendForceFeedbackCommand(DISFFC_RESET);//g_pJoystick->SendForceFeedbackCommand(DISFFC_SETACTUATORSON);if( FAILED(g_pJoystick->SendForceFeedbackCommand(DISFFC_SETACTUATORSON)))qDebug() << "start failed";hr = lpdieffect->Download();if(FAILED(hr))qDebug("download failed, the error NO is %X",hr);hr = lpdieffect->Start(INFINITE,DIES_SOLO);if(FAILED(hr))qDebug("start failed, the error NO is %X",hr);

代码有些冗长,参照了策随心和code从业员两位大佬的一些参数设置,虽然用的语言不一样,但是道理都是一样的。
代码运行并没有那么顺利,手柄在download和start以后,并没有反应,整个世界都是清净的。查找错误代码是0x80040205 DIERR_NOTEXCLUSIVEACQUIRED,注释是:The operation cannot be performed unless the device is acquired in DISCL_EXCLUSIVE mode。意思是这个操作在独占模式下才可以实现。因此我在create前面加了:

    if( FAILED(hr = g_pJoystick->SetCooperativeLevel(windID,DISCL_BACKGROUND|DISCL_EXCLUSIVE)))qDebug("error set coopreative, error NO is %X",hr);

运行,世界还是一片寂静。这个bug直到现在都没调好,有大佬知道为啥,请告诉我!

2 模拟XInput设备,通过XInput实现

deadline越来越近,不能在一条路上撞死。逛论坛找大神的时候,发现DInput的设备可以通过软件模拟,变成XInput设备。在微软提供的XInput库中,有函数直接可以实现vibration。尝试了多个软件以后,找到了开源的x360ce,程序和源代码都能在官网上找到。

2.1 x360ce设置

在完成相关设置后,可以一键autosetting。上面一排标签可以看到Force Feedback,在这个选项卡中,拖动test的进度条后,手柄震动起来了,第一步完成。x360ce

2.2 XInput 代码实现

在qt中搭一个简单界面,按键做震动开关。把下面的代码块放到按键的槽函数中。

    XINPUT_VIBRATION vibration;ZeroMemory( &vibration, sizeof(XINPUT_VIBRATION) );vibration.wLeftMotorSpeed = LeftMotorSpeed; vibration.wRightMotorSpeed = RightMotorSpeed; XInputSetState( uID, &vibration );

把x360ce中生成的xinput1_3.dll放到程序的运行目录下面,点击运行,动了!果然是亲儿子,这么小的代码量就能解决上面一片的所有问题。

2.3 x360ce分析

看了一下开源的代码,这个软件主要分为两大部分,一部分是生成dll文件,C++;一部分是界面,C#。
x360ce_dll工程里,代码量不大,主要是通过DirectInput控制手柄,再给XInput提供接口。震动的实时是调用XInputSetState,而不是directInputEffect.start,所以没有出现上面的独占问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/352018.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

虚幻4UE4使用PS4 DualShock4手柄ProController Switch手柄

虚幻4UE4使用PS4 DualShock4手柄ProController Switch手柄 使用虚幻引擎绑定输入操作可参考我的另一篇文章。虚幻4 UE4 绑定按键操作及切换视角-CSDN博客 使用虚幻引擎开发经常会碰到使用手柄或其他输入设备进行输入的情况&#xff0c;虽然在引擎->输入中有游戏手柄的各种…

Maven 打包插件 maven-jar-plugin

文章目录 指定版本生成可执行 Jar准备依赖&#xff0c;并指定依赖位置自动下载依赖的 Jar 文件 打包时排除文件与其他常用打包插件比较 本文是对 maven-jar-plugin 常用配置的介绍&#xff0c;更详细的学习请参照 Apache Maven JAR Plugin 官方文档 这是 maven 生命周期 packa…

Linux系统中使用Xbox360手柄

最近一个项目中需要用到Xbox360游戏手柄&#xff0c;硬件平台为周立功A7开发板&#xff0c;EPC-6G2C-L&#xff0c;折腾半天&#xff0c;终于弄好了&#xff1b; 正常电脑Ubuntu系统是自带手柄驱动的&#xff0c;将手柄插上电脑USB接口&#xff0c;将自动出现设备接口文件&…

dll修复都有哪些方法?详细解析各种dll修复方法

DLL&#xff08;动态链接库&#xff09;是 Windows 操作系统中的一种重要文件&#xff0c;它包含了许多程序所需的函数和资源。因此&#xff0c;当 DLL 文件出现问题时&#xff0c;可能会导致程序无法正常运行&#xff0c;甚至整个系统崩溃。这时候需要使用 DLL 修复工具进行修…

ROS:常用可视化工具的使用

目录 一、日志输出工具——rqt_console二、绘制数据曲线——rqt_plot三、图像渲染工具——rqt_image_view四、图形界面总接口——rqt五、Rviz六、Gazebo 一、日志输出工具——rqt_console 启动海龟键盘控制节点&#xff0c;打开日志输出工具 roscorerosrun turtlesim turtles…

linux版drastic模拟器设置,DraStic nds模拟器下载安装及使用图文教程

近日&#xff0c;曾便携过PSP用GBA模拟器的开发者Exophase发布了一款安卓用的NDS模拟器《DraStic》&#xff0c;DraStic曾是Exophase为开源掌机潘多拉编写的一款功能强大的NDS模拟器&#xff0c;现在移植到了Android。 你会在下载到的Download文件夹内发现三个文件&#xff0c;…

【娇娘内核】完整解密

这个很好&#xff0c;一直想了解的&#xff0c;转之。原帖&#xff0c;感谢“华敏乐” &#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#…

《口袋妖怪 太阳/月亮》正式公布 简体中文确认

Pokmon(大陆通常意译为<口袋妖怪>, 港译为<寵物小精靈>,台译为<神奇寶貝>)系列作为任天堂平台的的招牌游戏之一, 自诞生20年以来在全球有非常多的玩家. 此前发布的版本内置了8国语言, 但是并没有中文.其实中国玩家也非常多, 所以经常拿"8国语言"来…

[转幺幺]硬件解码—NDS影音播放专家iPlayer卡评测

转&#xff1a;幺幺任天堂 前言&#xff1a;DS并不缺乏多媒体能力&#xff0c;虽然任天堂官方没有给它加入这些&#xff0c;但是通过自制软件&#xff0c;我们已经实现了用DS听音乐、看电子书、看视频等功能。看书看图听音乐这些功能已经比较完美了&#xff0c;而且支持的都是目…

自己动手丰衣足食-自己动手修改GBA ROM游戏文件

经过一天的努力终于琢磨出怎么修改GBA的游戏文件也就是俗称的ROM文件&#xff0c;起因是因为偶然看到二手GBM&#xff0c;顿时抑制不住买了一台&#xff0c;可惜买得晚了&#xff0c;完美运行游戏又带金手指功能的烧录卡买不到了。SUPERCARD烧录卡看评论说费电&#xff0c;玩游…

【3DS】必做清单

3DS必做清单 引言 翻新后的小贴士 本文用于记录我的New Nindendo 3DSLL 软件翻新历程。 因为国内很多都提供现成的懒人包&#xff0c;如果上游有更新&#xff0c;没办法第一时间拿到。 如果你的网络条件够好&#xff0c;可以试试在Universal-Updater里面搜对应软件名字就好. 晚…

dstwo linux 模拟器,dstwo sfc模拟器插件Catsfc使用教程

dstwo作为史上最为优秀的一款nds烧录卡&#xff0c;这个烧录卡不仅支持完美运行nds游戏&#xff0c;还可以利用强大的硬件来运行许多经典模拟器游戏&#xff0c;其中就包括经典的sfc模拟器&#xff0c;下面给大家带来一款目前在兼容性和速度最好的dstwo用sfc模拟器插件Catsfc的…

nds linux模拟器下载,NDS模拟器Desmume

DeSmuME是一个 Nintendo Dual Screen 模拟器。开源&#xff0c;更新很勤快有希望能替代 No$GBA。DeSmuME是一个开源的适用于Linux&#xff0c;Mac OS和Windows的任天堂DS(NDS)模拟器。 DeSmuME支持保存&#xff0c;增加屏幕的大小&#xff0c;支持的过滤器&#xff0c;以提高图…

nds linux模拟器下载,NDS模拟器

《NDS模拟器》是一款能在电脑上模拟NDS的软件。DeSmuMe模拟器在图像和声音上有较大的优化。尤其表现在图像质量方面&#xff0c;颜色更加鲜明&#xff0c;甚至许多用NO$GBA看不清楚地细节都可以在DeSmuME中看到。 NDS模拟器软件背景 DeSmuME 最初是由YopYop156使用C开发并运行在…

Linux端NDS模拟器DeSmuME添加金手指

本文以Deepin上的DeSmuME客户端为例来说明如何添加金手指。本文参考的文章的链接为https://blog.wxm.be/2015/08/09/action-replay-codes-in-desmume-on-linux.html。 通过命令行apt install方式安装的DeSmuME客户端&#xff0c;游戏的存档、金手指等文件位于 ~/.config/desmum…

excel自动行高后只显示一行怎么回事?

当Excel自动调整行高后&#xff0c;如果只显示一行&#xff0c;可能是因为单元格中的文本内容过多&#xff0c;导致显示不全。可以尝试以下解决办法&#xff1a; 1. 双击单元格的边界。双击单元格的边界可以将单元格的高度调整为适合文本内容的高度。 2. 改变设置。点击单元格…

搭建Nextcloud私有云【零基础搭建私有云盘并内网穿透远程访问】

文章目录 摘要视频教程1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 转载自cpolar极点云的文章&#xff1a;使用Nextcl…

Ampere 又放大招,推出自研192 核AmpereOne 系列处理器,已投产

作者 | 伍杏玲 近日&#xff0c;Ampere Computing 发布2023年度战略和产品路线图&#xff0c;并推出全新的AmpereOne系列处理器&#xff0c;拥有多达 192 个单线程 Ampere 核&#xff0c;内核数量为业界最高。这是第一款基于 Ampere 新自研核的产品&#xff0c;由 Ampere 自有…

软件测试周刊(第18期):一个精确的测量胜过一千个专家的意见

这里记录过去一周我们看到的软件测试及周边的行业动态&#xff0c;周五发布。 本周刊开源&#xff08;GitHub: SoftwareTestingWeekly &#xff09;&#xff0c;欢迎提交 issue&#xff0c;投稿或推荐软件测试相关的内容。 科普 碳中和 碳达峰、碳中和最近频繁出现在大众视野…

【Linux】Nginx编译安装及系统服务添加

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Nginx 一、关于 NginxNginx和Apache的差异Apache的优势Nginx的优势 二. 编译安装Nginx服务1.关闭防火墙2.安装依赖包3.创建运行用户、组4.编译安装Nginx5.检查、启动、重启、…