2013-06-22 98 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])。