2013-06-22 56 views
0

我有一個方向盤遊戲控制器。現在我想寫一個像NFS-17這樣的比賽遊戲的驅動程序。我知道遊戲使用Xinput.I將用C寫驅動程序。 我的問題: 1)當我轉動方向盤時如何發送消息給遊戲。 2)它是否使用SendMessage()。 3)如果使用SendMessage(),如何獲取遊戲窗口的句柄以及我應該發送哪個wParam和lParam。發送遊戲控制器消息到一個比賽遊戲使用Xinput

回答

0

XInput用於xbox360控制器。對於方向盤X軸,您可以使用遊戲手柄的兩個觸發器。 XInput僅僅是一個getter/setter:P它讓你瞭解連接的控制器的狀態,並且報告在你的請求中是否連接了某些東西,它不監視或保存任何地方的任何東西,也不發送消息給應用程序有輸入焦點。發送消息是您可以構建應用程序的工作。 現在,到你真正需要的東西。您可以編寫一個簡單的C++應用程序來掃描控制器的狀態,但請等待......您沒有xbox360控制器:P因此,請先測試您的應用程序如何使用其oem驅動程序響應您的方向盤。如果你不能讀取它連接到任何USB端口(檢查MSDN的GetInputState()),然後嘗試使用Windows通用驅動程序(讓它安裝任何適合它,它甚至可能感知您的方向盤作爲一個Xbox360他們是非常類似於一個點,不同之處在於具有更昂貴車輪的軸和按鈕的數量)。 然後,當您實際讀取控制器(方向盤)的狀態時,使用GetHDC(窗口句柄),其中窗口句柄通過(我不記得肯定)檢索FindWindow(窗口的名稱/標題)。使用alt-tab檢查鼠標懸停在遊戲窗口中使用的任何標題。 當您擁有窗口句柄和設備上下文時,您可以通過窗口句柄發送消息給其回調函數WndProc函數,甚至通過設備上下文顯示文本/繪製圖像/形狀。這些消息應該是相應的虛擬鍵代碼(例如向上箭頭的VK_UP ...查看它),如果沒有可用的輪子,這些代碼將被推入鍵盤。訣竅是模擬每個車輪旋轉角度的PWM。只需發送一個交替推/放VK_LEFT鑰匙代碼的高頻消息,讓車輪高度轉向左側,並且轉向鎖只需發送一條KEY_DOWN消息,直至取消轉向鎖,然後發出KEY_UP消息,然後是相應的再次發生變化的頻率。對於輪子的低度,在按鍵/釋放按鍵之間做出更大的暫停。 製作驅動程序的好處是您可以根據自己的喜好調整靈敏度,按鈕相關性,死區。

另一方面,已經有這樣的模擬器,然後你可以使用一個USB通信API(從USB端口讀取/寫入數據,沒有什麼奇怪的東西:)用6 + 1 transmision構建自己的方向盤。 ),微控制器(PIC,atmega,nxp等,無論哪種產品更便宜,硬件USB準備就緒或加上USB控制器),X,Y等軸的可變電阻以及驅動系統的一些部件。祝你好運,並在YouTube上發佈:P!

P.S.地獄現在已經太晚了,但是,嘿......我覺得我需要寫一些我從未做過的曼波 - 詹姆,但是如果我不是那麼懶惰的話,那就行得通了。 :)

更新:xInput可能工作,如果兼容(可能是高端車輪和快樂),但directx也知道方向盤,所有這些。對我而言,這是唯一的解決方案。微軟表示XInput和directX都應該被用作XINput提供音頻和更多東西來兼容產品。 該algorythm是健全的,雖然開放許多實現。我爲GTA SA成功實現了它,因爲專用工具不支持我的版本。現在我的踏板上有了Acc和Brake,最後:)我使用了一個定時器來達到一定的頻率(自己選擇的,經驗豐富的東西),並將脈衝寬度從0s調整到了全週期(輕觸踏板並持續將踏板用於金屬)。每發送一個脈衝,我都會發送兩條消息:在脈衝開始時按下W/S鍵,並在計算出的脈衝寬度達到其最終值時按下W/S鍵。脈衝寬度的公式是總寬度的百分比,相同的百分比,或者通過靈敏度設置進行修改,例如踏板從最大行程距離行進(DirectInput報告[-1000,1000]的整數[我認爲]。[-fullbrake ,fullacceleration])。