一、项目要求:
捕获罗技G29数据,并进行UDP转发。
二、过程:
(一)不安装官方驱动,直接插入USB口,在控制面板的设备页面能找到游戏控制器,打开测试对话框,按钮是有反应的。
于是使用GitHub上的一个封装库SharpDirectInput,发现可以采集到大部分数据,但仍有数据无法采集。
回到控制面板的设备页面,找到游戏控制器测试对话框,也是不支持全部按钮,不支持离合器。估计这个也是用了DirectInput技术。
类似的参考文章:
https://blog.csdn.net/fedora08/article/details/2643873?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-13.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-13.no_search_link
(二)使用罗技SDK;
1.安装官方驱动,即LG游戏软件: https://support.logi.com/hc/zh-cn/articles/360025298053
2.下载官方SDK: https://www.logitechg.com.cn/zh-cn/innovation/developer-lab.html
打开官方Demo发现无数据出现,而LG游戏软件里面(点上方配置文件里面的测试)有数据出现。经过多台计算机反复实验,必须在拔掉G29USB后,先删除控制面板->设备里面系统默认安装的驱动程序——游戏控制器,有的系统还会多安装一个什么管理器,也要删掉;然后重新安装LG游戏软件。然后插上G29的USB,点击Demo的init,触动G29,即可收到数据。
3.利用提供的SDK进行编程即可收到所有数据。
4.但是,利用官方SDK要保证LG游戏软件始终运行。还有个更大的问题,就是必须保证调用SDK的应用程序窗口始终在最前面。
参考文章:
(三)使用winmm.dll接口编程,主要用到的函数:
joyGetDevCaps 查询指定的游戏杆设备以确定其性能
joyGetNumDevs 返回系统支持的游戏杆设备的数量
joyGetPos 查询指定的游戏杆设备的位置和活动性
joyGetPosEx 查询一个游戏杆设备的位置和它的按扭状态
joyGetThreshold 查询指定的游戏杆设备的当前移动阈值
joyReleaseCapture 释放由JoySetCapture函数设置的在指定游戏杆设备上的捕获
joySetCapture 发送一个游戏杆消息到指定的窗口
joySetThreshold 设置指定的游戏杆设备的移动阈值
这个待验证
(四)经过研究,发现DirectInput技术已经过时,目前用XInput技术
微软的解释:https://docs.microsoft.com/en-us/windows/win32/xinput/xinput-versions
其中提到:XInput is a cross-platform API that has shipped for use on Xbox and Windows.
可见这是用来在Windows平台上对接Xbox设备的一组API,后面文字提到比DirectInput哪里好。
回到罗技官方售卖页面,发现方向盘套件分为G20和G920两种,前者是PS3\PS4标准,后者是XBox标准。网上查了一下,前者是用在日本游戏机上,后者是用在欧美游戏机上,而前文所述微软的XInput这套API是针对XBox提供的。难道要换成G920吗?
待验证
(五)使用其它针对joystick封装好的库
参考文章:https://blog.csdn.net/yu_lei_/article/details/83218744,里面提到Github上面的两个库
SDL - mirror / SDL :这个库比较大,包括joystick在内的多个Direct3D支持,但是看意思也是基于Direct的。
Tasssadar / libenjoy:这个库比较简单,基本是对winmm.dll的封装
两个库下载后顺利编译运行,有待验证