C 使用原始输入的视窗上的gamepad力反馈(振动)

C 使用原始输入的视窗上的gamepad力反馈(振动),c,input,vibration,gamepad,C,Input,Vibration,Gamepad,我目前正在用C编写一个跨平台库,其中包括gamepad支持。windows上的Gamepad通信由原始输入和xinput处理,具体取决于特定的Gamepad 虽然xinput有助于xbox360控制器上的力反馈,但我还没有找到一种使用原始输入的方法。我有一些可以提供力反馈的游戏板,但我找不到一种通过原始输入来实现的方法。有办法做到这一点吗 我不喜欢使用DirectInputAPI,因为微软不推荐使用它 编辑: 由于我在很大程度上实现了游戏板,也许我可以把问题缩小一点。我怀疑通过读取HIDP_CA

我目前正在用C编写一个跨平台库,其中包括gamepad支持。windows上的Gamepad通信由原始输入和xinput处理,具体取决于特定的Gamepad

虽然xinput有助于xbox360控制器上的力反馈,但我还没有找到一种使用原始输入的方法。我有一些可以提供力反馈的游戏板,但我找不到一种通过原始输入来实现的方法。有办法做到这一点吗

我不喜欢使用DirectInputAPI,因为微软不推荐使用它

编辑:

由于我在很大程度上实现了游戏板,也许我可以把问题缩小一点。我怀疑通过读取HIDP_CAPS结构的NumberOutputValueCaps,可以找到游戏板中的隆隆马达数量。这为我所有的测试游戏提供了正确的结果

我使用funtcion HidP_GetUsageValue读取轴值,这很好。现在我怀疑调用HidP_SetUsageValue应该允许我改变这个输出值,打开隆隆马达。但是,调用此函数失败。该函数是否能够访问隆隆马达?

HidP_SetUsageValue()只修改报告缓冲区——您需要首先准备一个大小合适的缓冲区(这可能是函数失败的原因;输入报告和输出报告的大小不一定相同),然后将其发送到设备,然后再生效。MSDN建议您可以使用HidD_SetOutputReport()实现此目的,但我更希望使用WriteFile(),如下示例代码:

这段代码(基于Linux驱动程序)让我可以控制DualShock 4上的电机和LED:

const char *path = /* from GetRawInputDeviceInfo(RIDI_DEVICENAME) */;
HANDLE hid_device = CreateFile(path, GENERIC_READ | GENERIC_WRITE,
                               FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
                               OPEN_EXISTING, 0, NULL);
assert(hid_device != INVALID_HANDLE_VALUE);
uint8_t buf[32];
memset(buf, 0, sizeof(buf));
buf[0] = 0x05;
buf[1] = 0xFF;
buf[4] = right_motor_strength;  // 0-255
buf[5] = left_motor_strength;   // 0-255
buf[6] = led_red_level;         // 0-255
buf[7] = led_green_level;       // 0-255
buf[8] = led_blue_level;        // 0-255
DWORD bytes_written;
assert(WriteFile(hid_device, buf, sizeof(buf), &bytes_written, NULL));
assert(bytes_written == 32);
(编辑:固定缓冲区偏移)