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);
(编辑:固定缓冲区偏移)