【问题标题】:gamepad force feedback (vibration) on windows using raw input使用原始输入在 Windows 上的游戏手柄力反馈(振动)
【发布时间】:2014-08-26 12:42:15
【问题描述】:

我目前正在用 C 语言编写一个包含游戏手柄支持的跨平台库。 Windows 上的游戏手柄通信由原始输入和 xinput 处理,具体取决于特定的游戏手柄。

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

我不喜欢使用 directinput api,因为它已被 Microsoft 弃用和劝阻。

编辑:

由于我已经在很大程度上实现了游戏手柄,也许我可以稍微缩小一下问题的范围。我怀疑可以通过读取 HIDP_CAPS 结构的 NumberOutputValueCaps 找到游戏手柄中的震动马达数量。这为我所有的测试游戏手柄提供了正确的结果。

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

【问题讨论】:

    标签: c input vibration gamepad


    【解决方案1】:

    HidP_SetUsageValue() 只修改一个报告缓冲区——您需要首先准备一个适当大小的缓冲区(这可能是函数失败的原因;输入报告和输出报告的大小不一定相同)然后发送它到设备之前,它会产生任何影响。 MSDN 建议您可以为此目的使用 HidD_SetOutputReport(),但我最好使用 WriteFile(),按照以下示例代码:https://code.msdn.microsoft.com/windowshardware/HClient-HID-Sample-4ec99697/sourcecode?fileId=51262&pathId=340791466

    这个 sn-p(基于 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);
    

    (编辑:固定缓冲区偏移)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多