Как включить Windows.Устройства.HumanInterfaceDevice.dll в проекте Visual Studio 2017

#.net #visual-studio

#.net #visual-studio

Вопрос:

Я хочу использовать класс HID Device в проекте C # в Visual Studio

Я пытаюсь добавить dll в список ссылок, щелкнув правой кнопкой мыши раздел ссылок в обозревателе решений> Добавить ссылку и перейдя к местоположению ссылки (C:/Windows/System32/Windows .Устройства.HumanInterfaceDevice.dll ). Я получаю сообщение об ошибке с вопросом, есть ли у меня правильные разрешения для файла, или это допустимая сборка COM.

Как мне правильно импортировать эту DLL?

Ответ №1:

Класс, на который вы ссылаетесь здесь, является классом UWP. Это автоматически отобразится в вашем проекте, если у вас есть проект UWP, но я подозреваю, что вы работаете не над проектом UWP.

Вот пример использования класса Hid Device в библиотеке-оболочке:https://github.com/MelbourneDeveloper/Device.Net/blob/master/src/Hid.Net.UWP/UWPHidDevice.cs . Обратите внимание, что если вы хотите использовать Hid с UWP, вам необходимо определить свои устройства в манифесте пакета. Смотрите здесь.

Однако, если вы не используете UWP — например, .NET core, вам нужно будет использовать другой класс или библиотеку для доступа к устройствам Hid. Вот классы для переноса Windows API

Код:https://github.com/MelbourneDeveloper/Device.Net/blob/master/src/Hid.Net/Windows/HidAPICalls.cs

 public static class HidAPICalls
    {
        #region Private Static Fields
        private static Guid? _HidGuid;
        #endregion

        #region Constants
        private const int HIDP_STATUS_SUCCESS = 0x110000;
        #endregion

        #region API Calls

        [DllImport("hid.dll", SetLastError = true)]
        private static extern bool HidD_GetPreparsedData(SafeFileHandle hidDeviceObject, out IntPtr pointerToPreparsedData);

        [DllImport("hid.dll", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
        private static extern bool HidD_GetManufacturerString(SafeFileHandle hidDeviceObject, IntPtr pointerToBuffer, uint bufferLength);

        [DllImport("hid.dll", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
        private static extern bool HidD_GetProductString(SafeFileHandle hidDeviceObject, IntPtr pointerToBuffer, uint bufferLength);

        [DllImport("hid.dll", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
        private static extern bool HidD_GetSerialNumberString(SafeFileHandle hidDeviceObject, IntPtr pointerToBuffer, uint bufferLength);

        [DllImport("hid.dll", SetLastError = true)]
        private static extern int HidP_GetCaps(IntPtr pointerToPreparsedData, out HidCollectionCapabilities hidCollectionCapabilities);

        [DllImport("hid.dll", SetLastError = true)]
        private static extern bool HidD_GetAttributes(SafeFileHandle hidDeviceObject, out HidAttributes attributes);

        [DllImport("hid.dll", SetLastError = true)]
        private static extern void HidD_GetHidGuid(out Guid hidGuid);

        [DllImport("hid.dll", SetLastError = true)]
        private static extern bool HidD_FreePreparsedData(ref IntPtr pointerToPreparsedData);

        private delegate bool GetString(SafeFileHandle hidDeviceObject, IntPtr pointerToBuffer, uint bufferLength);

        #endregion

        #region Private Static Methods
        private static string GetHidString(SafeFileHandle safeFileHandle, GetString getString)
        {
            var pointerToBuffer = Marshal.AllocHGlobal(126);
            var isSuccess = getString(safeFileHandle, pointerToBuffer, 126);
            Marshal.FreeHGlobal(pointerToBuffer);
            WindowsDeviceBase.HandleError(isSuccess, "Could not get Hid string");
            return Marshal.PtrToStringUni(pointerToBuffer);
        }
        #endregion

        #region Public Static Methods
        public static HidAttributes GetHidAttributes(SafeFileHandle safeFileHandle)
        {
            var isSuccess = HidD_GetAttributes(safeFileHandle, out var hidAttributes);
            WindowsDeviceBase.HandleError(isSuccess, "Could not get Hid Attributes");
            return hidAttributes;
        }

        public static HidCollectionCapabilities GetHidCapabilities(SafeFileHandle readSafeFileHandle)
        {
            var isSuccess = HidD_GetPreparsedData(readSafeFileHandle, out var pointerToPreParsedData);
            WindowsDeviceBase.HandleError(isSuccess, "Could not get pre parsed data");

            var result = HidP_GetCaps(pointerToPreParsedData, out var hidCollectionCapabilities);
            if (result != HIDP_STATUS_SUCCESS)
            {
                throw new Exception($"Could not get Hid capabilities. Return code: {result}");
            }

            isSuccess = HidD_FreePreparsedData(ref pointerToPreParsedData);
            WindowsDeviceBase.HandleError(isSuccess, "Could not release handle for getting Hid capabilities");

            return hidCollectionCapabilities;
        }

        public static string GetManufacturer(SafeFileHandle safeFileHandle)
        {
            return GetHidString(safeFileHandle, HidD_GetManufacturerString);
        }

        public static string GetProduct(SafeFileHandle safeFileHandle)
        {
            return GetHidString(safeFileHandle, HidD_GetProductString);
        }

        public static string GetSerialNumber(SafeFileHandle safeFileHandle)
        {
            return GetHidString(safeFileHandle, HidD_GetSerialNumberString);
        }

        public static Guid GetHidGuid()
        {
            if (_HidGuid.HasValue)
            {
                return _HidGuid.Value;
            }

            HidD_GetHidGuid(out var hidGuid);

            _HidGuid = hidGuid;

            return hidGuid;
        }
        #endregion
}
  

Вышесказанное является частью устройства.Библиотека Net, которая позволила бы вам использовать Hid на нескольких платформах.