首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Xinput向竞速游戏发送游戏控制器消息

使用Xinput向竞速游戏发送游戏控制器消息
EN

Stack Overflow用户
提问于 2013-06-22 23:23:12
回答 1查看 1.1K关注 0票数 0

我有一个方向盘游戏controller.Now,我正在尝试编写一个驱动程序,用于玩比赛游戏,例如NFS-17。我知道这个游戏使用的是新浦。我将用C编写驱动程序。我的问题是: 1)当我转动方向盘时,如何向游戏发送消息。2)是否使用SendMessage()。3)如果使用SendMessage(),如何获取游戏窗口的句柄,应该发送哪个wParam和lParam。

EN

回答 1

Stack Overflow用户

发布于 2013-11-17 22:26:24

XInput用于xbox360控制器。对于方向盘X轴,可以使用游戏手柄的两个触发器。XInput不再是一个getter/setter :P它会让你得到连接的控制器的状态,并报告是否有连接的东西,只根据你的请求,它不会在任何地方监控或保存任何东西,也不会向具有输入焦点的应用程序发送消息。发送消息是你的工作,使用你可以构建的应用程序。现在,来看看你真正需要的是什么。你可以写一个简单的C++应用程序来扫描控制器的状态,但是wait...you没有xbox360控制器:P所以首先测试你的应用程序如何响应你的原始设备制造商驱动程序的方向盘。如果你不能在任何usb端口上读取它作为连接(查看MSDN the GetInputState()),然后尝试使用windows通用驱动程序(让它安装任何适合它的驱动程序,它甚至可能会将您的方向盘视为xbox360它们非常类似于一个点,不同之处在于轴的数量和具有更昂贵轮子的按钮)。然后,当你真正读取控制器(方向盘)的状态时,使用GetHDC( windowhandle),其中windowhandle是通过(我记不清)FindWindow(窗口的名称/标题)来检索的。使用alt-tab键检查鼠标悬停在游戏窗口中使用的任何标题。当您拥有窗口句柄和设备上下文时,您可以通过窗口句柄向其回调WndProc函数响应发送消息,甚至可以通过设备上下文显示文本/绘制图像/形状。消息应该是相应的虚拟键代码(VK_UP代表向上箭头,instance...look it UP代表向上箭头),如果没有轮子可用,这些代码将被推到键盘上。诀窍是模拟轮子旋转的每一度的PWM。只需发送交替推动/释放VK_LEFT键码的高频消息,用于向左高度转动的轮子和用于转向锁的仅发送一条KEY_DOWN消息,直到解开转向锁,然后发送KEY_UP消息,随后再次发送相应的交替频率。对于低度滚轮,在按键/释放消息之间进行较大的停顿。做一个驱动的好处是,你可以根据自己的喜好来调整灵敏度,按钮相关性,死区。

另一方面,像这样的模拟器已经有了,而且你也可以使用windows的6+1通信接口(从/向USB端口读/写数据,没什么特别的:),一个微控制器(PIC,atmega,恩智浦等),X,Y等轴的可变电阻和驱动系统的一些部件来构建自己的带有usb传输的方向盘。祝你好运,并在youtube上发布:P!

天哪,现在太晚了,但是,嘿……我觉得我需要写一些我从来没有做过的mambo jambo,但是它可以工作……如果我不是那么懒的话。:)

更新:如果兼容(可能是高端车轮和joys),xInput可能会工作,但它也知道方向盘,所有的方向盘。对我来说,这是唯一的解决方案。微软表示,XInput和directX都应该使用,因为XINput为兼容产品提供了音频和更多内容。算法是合理的,尽管对许多实现都是开放的。我成功地为GTA SA实现了它,因为专用工具不支持我的版本。现在我从踏板开始使用Acc和Brake,最后:)我使用计时器来达到一定的频率(自己选择,经验性的东西),并将脉冲宽度从接近0调整到完整的周期(轻触踏板并连续地将踏板应用于金属)。对于每个脉冲,我发送了两条消息: W/S键在脉冲开始时按下,W/S键在计算的脉冲宽度达到其结束值时按下。脉冲宽度的公式是总宽度的百分比,相同的百分比或通过灵敏度设置进行修改,例如踏板从其最大行程距离移动(我认为DirectInput报告-1000-1000中的整数)。-fullbrake,全速加速)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17252273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档