Job*_*lle 3 c input vibration gamepad
我目前正在C中编写一个包含游戏手柄支持的跨平台库.Windows上的游戏手柄通信由原始输入和xinput处理,具体取决于特定的游戏手柄.
虽然xinput有助于在xbox360控制器上进行力反馈,但我还没有找到使用原始输入执行此操作的方法.我有一些可以提供力反馈的游戏手柄,但我无法通过原始输入找到一种方法.有没有办法做到这一点?
我不喜欢使用directinput api,因为微软已经弃用它并且不鼓励它.
编辑:
由于我已经在很大程度上实现了游戏手柄,也许我可以稍微缩小这个问题.我怀疑通过读取HIDP_CAPS结构的NumberOutputValueCaps可以找到游戏手柄中的隆隆马达数量.这为我的所有测试游戏手柄提供了正确的结果.
我正在使用funtcion HidP_GetUsageValue来读取轴值,这很好.现在我怀疑调用HidP_SetUsageValue应该允许我改变这个输出值,打开隆隆电机.但是,调用此函数失败.该功能是否能够接入隆隆电机?
HidP_SetUsageValue()仅修改报表缓冲区 - 您需要首先准备一个适当大小的缓冲区(这可能是函数失败的原因;输入报告和输出报告的大小不一定相同)然后将其发送到设备之前会产生任何影响.MSDN建议你可以使用HidD_SetOutputReport()来实现这个目的,但是我更喜欢WriteFile(),遵循以下示例代码:https://code.msdn.microsoft.com/windowshardware/HClient-HID-Sample-4ec99697/源代码?FILEID = 51262&PATHID = 340791466
这段代码(基于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);
Run Code Online (Sandbox Code Playgroud)
(编辑:固定缓冲区偏移)