一、項目要求:
捕獲羅技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游戲軟件始終運行。
參考文章:
https://blog.csdn.net/Sakura_Jun/article/details/87718845?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
(三)使用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的封裝
第一個庫可以完整讀取所有數據;
第二個庫運行出錯,而且目標平台是win32。
三、小結
現在,用官方驅動是可以讀取數據的,但還有個更大的問題,就是必須保證調用SDK的應用程序窗口始終在最前面。
