我有一个方向盘游戏控制器。现在我正在尝试编写一个用于玩NFS-17等竞赛游戏的驱动程序。我知道游戏正在使用Xinput。我将在C中编写驱动程序。 我的问题: 1)当我转动方向盘时如何向游戏发送消息。 2)它是否使用SendMessage()。 3)如果使用SendMessage(),如何获取游戏窗口的句柄以及我应该发送哪个wParam和lParam。
答案 0 :(得分:0)
XInput适用于xbox360控制器。对于方向盘X轴,您可以使用游戏手柄的两个触发器。 XInput不再是一个getter / setter:P它可以让你获得连接控制器的状态并报告你的请求是否有任何连接,它不会监视或保存任何地方,也不会向应用程序发送消息有投入重点。使用您可以构建的应用程序发送消息是您的工作。 现在,直到你真正需要的。您可以编写一个简单的C ++应用程序来扫描控制器的状态,但是等等......您没有xbox360控制器:P首先测试您的应用程序如何使用其oem驱动程序响应方向盘。如果您无法在任何USB端口上读取连接(在MSDN上检查GetInputState())然后尝试使用Windows通用驱动程序(让它安装任何适合它的,它甚至可能将您的方向盘视为xbox360它们非常类似于一个点,差异是轴和按钮的数量与更昂贵的轮子)。 然后,当您实际读取控制器(方向盘)的状态时,使用GetHDC(windowhandle),其中通过(我不记得确定)FindWindow(窗口的名称/标题)检索windowhandle。使用alt-tab检查鼠标悬停用于游戏窗口的任何标题。 当您拥有窗口句柄和设备上下文时,您可以通过窗口句柄向其回调WndProc函数corespondent发送消息,甚至通过设备上下文显示文本/绘制图像/形状。消息应该是相应的虚拟键代码(例如,向上箭头的VK_UP ...查找它),如果没有可用的轮子,它将被推到键盘上。诀窍是模拟车轮旋转的每个程度的PWM。只需发送交替按下/释放VK_LEFT键代码的高频信息,以便向左转动高转向,对于转向锁,只需发送一个KEY_DOWN消息,直到转向锁被移除,然后是KEY_UP消息,然后是相应的再次交替的频率。对于低度轮,在按键/释放消息之间产生较大的暂停。 制作驱动程序的好处是,您可以根据自己的喜好调整灵敏度,按钮关联,死区。
另一方面,有这样的模拟器已经然后再次使用usb通信API(从USB端口读取/写入数据,没有什么花哨:)可以构建自己的6 + 1传输方向盘从Windows,微控制器(PIC,atmega,nxp等等,无论是更便宜的还是硬件USB就绪或加上USB控制器),X,Y等轴的可变电阻和驱动系统的某些部件。祝你好运,发布在youtube上:P!
P.S。地狱现在已经太晚了,但是嘿......我觉得我需要写一些我从未做过的mambo-jambo,但哪个会工作......如果我不那么懒。 :)
更新:xInput可以兼容(可能是高端车轮和欢乐),但是directx也知道方向盘,所有这些都是。对我来说,这是唯一的解决方案。微软称XInput和directX都应该用作XINput,为兼容产品提供音频和更多功能。 虽然对许多实现开放,但algorythm是合理的。我成功地为GTA SA实现了它,因为专用工具不支持我的版本。现在我有来自踏板的Acc和Brake,最后:)我用一个计时器来达到一定的频率(自己选择,经验的东西),并调整脉冲宽度从近0s到整个周期(轻触踏板和连续应用踏板到金属上)。在每个脉冲上,我发送了两条消息:当脉冲开始时W / S键向下,当计算出的脉冲宽度达到最终值时W / S键向上。脉冲宽度的公式是总宽度的百分比,相同的百分比或灵敏度设置修改,例如踏板从其最大行程距离(DirectInput报告[-1000,1000]中的整数我认为。[-fullbrake] ,fullacceleration])。