none
使用win10 api开发HID设备,HidDevice.FromIdAsync返回0 RRS feed

  • 问题

  • 我有个HID手柄,想要通过win 10提供的api来收发报告。但是HidDevice.FromIdAsync()总是返回null,可以确定的有以下:

    1. 在manifest中已经声明了设备

    2. 使用HidDevice.GetDeviceSelector()和Enumeration.DeviceInformation.FindAllAsync()能获得正确的设备信息

     string selector = HidDevice.GetDeviceSelector(UsagePage,UsageId,Vid,Pid);
    var deviceCollection = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(selector);
    
                if (deviceCollection.Count == 0)
                    return "No game pad controller found!";
    
                for (int i = 0; i < deviceCollection.Count && i < MaxControllers;i++)
                {
                    var _device = await Windows.Devices.HumanInterfaceDevice.HidDevice.FromIdAsync(deviceCollection[i].Id, Windows.Storage.FileAccessMode.ReadWrite);
                    if (_device == null)
                    {
                        try
                        {
                            var deviceAccessStatus = DeviceAccessInformation.CreateFromId(deviceCollection[i].Id).CurrentStatus;
                            switch (deviceAccessStatus)
                            {
                                case DeviceAccessStatus.DeniedByUser:
                                    return "User denied the access!";
                                case DeviceAccessStatus.DeniedBySystem:
                                    return "System denied the access!";
                            }
                        }
                        catch { }
                        return "Failed to connect to the controller!";
                    }
                    Controllers.Add(new Controller(_device));
                }

    2015年7月3日 2:00

答案

  • 你好,

    返回值为空而不是E_ACCESSDENIED似乎说明了这个方法没能够根据ID找到相应的设备。

    所以我根据你用的Class去看了一下:

    Windows.Devices.Enumeration.DeviceInformation.FindAllAsync的返回是:IAsyncOperation<DeviceInformationCollection>也就是返回的是DeviceInformationCollection这个集合的集合。我觉得你的问题应该跟这里的遍历有关。可能你需要先遍历DeviceInformationCollection集合,再从DeviceInformationCollection里遍历出DeviceInformation然后获取它的ID

    为了验证这个情况,我建议你debug的时候看一看你的设备ID是多少然后直接使用这个方法HidDevice.FromIdAsync配合你的ID看一看结果,如果直接用ID可以的话你试试我上面的方法。



    Barry
    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年7月6日 2:10
    版主