gpt4 book ai didi

c - 使用原始输入在 Windows 上的游戏 handle 力反馈(振动)

转载 作者:太空狗 更新时间:2023-10-29 16:06:54 28 4
gpt4 key购买 nike

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

虽然 xinput 有助于 xbox360 Controller 上的力反馈,但我还没有找到使用原始输入来执行此操作的方法。我有一些可以提供力反馈的游戏 handle ,但我找不到通过原始输入来执行此操作的方法。有办法做到这一点吗?

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

编辑:

由于我已经实现了大部分游戏 handle ,也许我可以缩小问题范围。我怀疑通过读取 HIDP_CAPS 结构的 NumberOutputValueCaps 可以找到游戏 handle 中的隆隆声马达的数量。这为我所有的测试游戏 handle 提供了正确的结果。

我正在使用函数 HidP_GetUsageValue 读取轴值,效果很好。现在我怀疑调用 HidP_SetUsageValue 应该允许我更改此输出值,打开隆隆声电机。但是,调用此函数会失败。此函数是否应该能够访问隆隆声电机?

最佳答案

HidP_SetUsageValue() 仅修改报告缓冲区——您需要首先准备一个适当大小的缓冲区(这可能是该函数失败的原因;输入报告和输出报告的大小不一定相同)然后发送它之前它会产生任何影响的设备。 MSDN 建议您可以为此目的使用 HidD_SetOutputReport(),但我使用 WriteFile() 时运气更好,示例代码位于:https://code.msdn.microsoft.com/windowshardware/HClient-HID-Sample-4ec99697/sourcecode?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);

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

关于c - 使用原始输入在 Windows 上的游戏 handle 力反馈(振动),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25506101/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com