Exemplo n.º 1
0
        //デバイスの基本情報をセットする
        private bool InitDevInfo()
        {
            SafeFileHandle hHidDev = DeviceAccess.OpenQueryMode(devInfo.DevicePath);

            if (hHidDev.IsInvalid)
            {
                return(false);
            }

            //各種レポートのバッファサイズを取得する
            bool   isOK = false;
            IntPtr pPreparsedData;

            if (HidD_GetPreparsedData(hHidDev, out pPreparsedData))
            {
                tCaps = new HIDP_CAPS();
                isOK  = HidP_GetCaps(pPreparsedData, ref tCaps);
                HidD_FreePreparsedData(pPreparsedData);
            }

            //その他、必要な情報があればここで処理する
            //

            hHidDev.Close();
            return(isOK);
        }
Exemplo n.º 2
0
        //
        private HidDeviceInfo[] GetDeviceList(bool isFindAll, int vendorID, int productID)
        {
            //デバイス情報セットを取得する
            Guid hidGuid = new Guid();

            HidD_GetHidGuid(ref hidGuid);
            IntPtr hDevInfoSet = SetupDiGetClassDevs(
                ref hidGuid, null, IntPtr.Zero, DIGCF.DIGCF_DEVICEINTERFACE | DIGCF.DIGCF_PRESENT);

            //各デバイス情報からデバイスのパス名を取得する
            SP_DEVICE_INTERFACE_DATA DeviceInterfaceData = new SP_DEVICE_INTERFACE_DATA();

            DeviceInterfaceData.cbSize = Marshal.SizeOf(DeviceInterfaceData);
            int MemberIndex = 0;
            StringCollection scDevicePath = new StringCollection();

            while (SetupDiEnumDeviceInterfaces(hDevInfoSet, IntPtr.Zero, ref hidGuid, MemberIndex++, ref DeviceInterfaceData))
            {
                string devicePath = GetDevicePath(hDevInfoSet, ref DeviceInterfaceData);
                if (string.IsNullOrEmpty(devicePath) || scDevicePath.Contains(devicePath))
                {
                    continue;
                }
                scDevicePath.Add(devicePath);
            }

            //デバイス情報セットを破棄する
            SetupDiDestroyDeviceInfoList(hDevInfoSet);

            //目的のデバイスを検索する
            HIDD_ATTRIBUTES HiddAttributes = new HIDD_ATTRIBUTES();

            HiddAttributes.Size = Marshal.SizeOf(HiddAttributes);
            ArrayList alHidDevInfos = new ArrayList();

            foreach (string devicePath in scDevicePath)
            {
                //問い合わせモードでデバイスをオープンする
                SafeFileHandle hHidDev = DeviceAccess.OpenQueryMode(devicePath);
                if (hHidDev.IsInvalid)
                {
                    continue;
                }

                //デバイスの属性を取得する
                if (HidD_GetAttributes(hHidDev, ref HiddAttributes))
                {
                    //目的のデバイスであれば追加情報を取得する
                    if (isFindAll ||
                        (HiddAttributes.VendorID == vendorID && HiddAttributes.ProductID == productID))
                    {
                        string devVenderName, devDeviceName, devSerialNumber;
                        GetAdditionalInfo(hHidDev, out devVenderName, out devDeviceName, out devSerialNumber);
                        HidDeviceInfo hidDevInfo = new HidDeviceInfo(devicePath, ref HiddAttributes, devVenderName, devDeviceName, devSerialNumber);
                        alHidDevInfos.Add(hidDevInfo);
                    }
                }

                //クローズ
                hHidDev.Close();
            }

            //取得したデバイス情報を配列に格納する(長さ0以上の配列となる)
            HidDeviceInfo[] hidDevInfos = new HidDeviceInfo[alHidDevInfos.Count];
            alHidDevInfos.CopyTo(hidDevInfos);

            return(hidDevInfos);
        }