树莓派3通用应用中HidDevice.FromIdAsync返回null,已识别Makey Makey
我之前在Windows设备上碰到过一模一样的问题,大多是权限或者配置环节出了问题,给你几个具体的排查和解决步骤:
1. 先检查应用的Package.appxmanifest权限声明
这是最常见的触发原因!通用Windows应用必须明确声明要访问的HID设备权限,你需要在Package.appxmanifest里添加对应的DeviceCapability,指定Makey Makey的VID和PID(就是你识别到的VID_2A66&PID_0001),还要匹配它的HID用途(Makey Makey模拟键盘,对应usage page 1,usage ID 6)。
把这段XML代码添加到你的manifest的<Capabilities>节点下:
<DeviceCapability Name="humaninterfacedevice"> <Device Id="vidpid:2A66 0001"> <Function Type="usage:1 6" /> </Device> </DeviceCapability>
2. 确认系统层面的设备访问权限
有时候就算manifest声明了权限,系统也可能没给应用授权:
- 打开Windows设置 → 隐私和安全性 → 设备权限,确保你的应用有访问HID设备的权限
- 如果是Windows IoT Core系统,还要登录树莓派的设备门户,检查设备是否允许应用访问外部硬件
3. 验证FromIdAsync的调用方式是否正确
你要确保传入的设备ID格式正确,并且正确使用异步方法和访问模式。比如:
using System.Runtime.InteropServices; using Windows.Devices.HumanInterfaceDevice; using Windows.Devices.Enumeration; // 替换成你识别到的那个设备Id string targetDeviceId = @"\?\HID#VID_2A66&PID_0001&MI_00&Col01#7&2d913a22&0&0000#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}"; HidDevice makeyDevice = await HidDevice.FromIdAsync(targetDeviceId, FileAccessMode.ReadWrite); if (makeyDevice == null) { // 获取错误码快速定位问题,非常实用 int errorCode = Marshal.GetLastWin32Error(); Debug.WriteLine($"调用失败,错误码:{errorCode}"); // 比如错误码5是权限不足,2是找不到设备,根据错误码对应排查 }
注意:一定要用await等待异步调用完成,指定合适的FileAccessMode,另外不要遗漏Marshal.GetLastWin32Error(),它能帮你快速区分是权限、设备不存在还是被占用的问题。
4. 排查设备被占用的情况
Makey Makey默认会被系统识别为键盘,系统自带的键盘驱动可能会占用设备,导致你的应用无法获取访问权。可以临时在设备管理器里禁用Makey Makey对应的键盘设备,然后重新运行应用测试,如果能成功打开,就说明是这个原因。测试完记得重新启用驱动,不然系统没法用它当键盘。
5. 确认系统版本兼容性
树莓派3上的Windows版本至少要Windows 10 1511(10.0.10586)以上,HidDevice API才被支持。如果你的系统版本太老,升级系统后再试。
内容的提问来源于stack exchange,提问作者True Solutions

