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