zoukankan      html  css  js  c++  java
  • C#枚举硬件设备(升级版)

    先取设备类型: 
    /// <summary>
    /// 设备类型
    /// </summary>
    class DeviceClasses
    {
    public static Guid ClassesGuid;
    public const int MAX_SIZE_DEVICE_DESCRIPTION = 1000;
    public const int CR_SUCCESS = 0x00000000;
    public const int CR_NO_SUCH_VALUE = 0x00000025;
    public const int CR_INVALID_DATA = 0x0000001F;
    private const int DIGCF_PRESENT = 0x00000002;
    private const int DIOCR_INSTALLER = 0x00000001;
    private const int MAXIMUM_ALLOWED = 0x02000000;
    public const int DMI_MASK = 0x00000001;
    public const int DMI_BKCOLOR = 0x00000002;
    public const int DMI_USERECT = 0x00000004;

    [StructLayout(LayoutKind.Sequential)]
    class SP_DEVINFO_DATA
    {
    public int cbSize;
    public Guid ClassGuid;
    public int DevInst;
    public ulong Reserved;
    }

    [DllImport(
    "cfgmgr32.dll")]
    private static extern UInt32 CM_Enumerate_Classes(UInt32 ClassIndex, ref Guid ClassGuid, UInt32 Params);

    [DllImport(
    "setupapi.dll")]
    private static extern Boolean SetupDiClassNameFromGuidA(ref Guid ClassGuid, StringBuilder ClassName, UInt32 ClassNameSize, ref UInt32 RequiredSize);

    [DllImport(
    "setupapi.dll")]
    private static extern IntPtr SetupDiGetClassDevsA(ref Guid ClassGuid, UInt32 Enumerator, IntPtr hwndParent, UInt32 Flags);

    [DllImport(
    "setupapi.dll")]
    private static extern Boolean SetupDiDestroyDeviceInfoList(IntPtr DeviceInfoSet);

    [DllImport(
    "setupapi.dll")]
    private static extern IntPtr SetupDiOpenClassRegKeyExA(ref Guid ClassGuid, UInt32 samDesired, int Flags, IntPtr MachineName, UInt32 Reserved);

    [DllImport(
    "setupapi.dll")]
    private static extern Boolean SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet, UInt32 MemberIndex, SP_DEVINFO_DATA DeviceInfoData);

    [DllImport(
    "advapi32.dll")]
    private static extern UInt32 RegQueryValueA(IntPtr KeyClass, UInt32 SubKey, StringBuilder ClassDescription, ref UInt32 sizeB);

    /// <summary>
    /// 设备类型图标信息
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    public class SP_CLASSIMAGELIST_DATA
    {
    public int cbSize;
    public ImageList ImageList;
    public ulong Reserved;
    }
    public struct RECT
    {
    long left;
    long top;
    long right;
    long bottom;
    }

    /// <summary>
    /// 载入图片
    /// </summary>
    /// <param name="hInstance"></param>
    /// <param name="Reserved"></param>
    /// <returns></returns>
    [DllImport("user32.dll")]
    public static extern int LoadBitmapW(int hInstance, ulong Reserved);

    /// <summary>
    /// 获取图标
    /// </summary>
    /// <param name="ClassImageListData"></param>
    /// <returns></returns>
    [DllImport("setupapi.dll")]
    public static extern Boolean SetupDiGetClassImageList(out SP_CLASSIMAGELIST_DATA ClassImageListData);
    [DllImport(
    "setupapi.dll")]
    public static extern int SetupDiDrawMiniIcon(Graphics hdc, RECT rc, int MiniIconIndex, int Flags);
    [DllImport(
    "setupapi.dll")]
    public static extern bool SetupDiGetClassBitmapIndex(Guid ClassGuid, out int MiniIconIndex);
    [DllImport(
    "setupapi.dll")]
    public static extern int SetupDiLoadClassIcon(ref Guid classGuid, out IntPtr hIcon, out int index);

    /// <summary>
    /// 枚举设备类型
    /// </summary>
    /// <param name="ClassIndex"></param>
    /// <param name="ClassName"></param>
    /// <param name="ClassDescription"></param>
    /// <param name="DevicePresent"></param>
    /// <returns></returns>
    public static int EnumerateClasses(UInt32 ClassIndex, StringBuilder ClassName, StringBuilder ClassDescription, ref bool DevicePresent)
    {
    Guid ClassGuid
    = Guid.Empty;
    IntPtr NewDeviceInfoSet;
    UInt32 result;
    SP_DEVINFO_DATA DeviceInfoData
    = new SP_DEVINFO_DATA();
    bool resNam = false;
    UInt32 RequiredSize
    = 0;
    result
    = CM_Enumerate_Classes(ClassIndex, ref ClassGuid, 0);
    DevicePresent
    = false;
    SP_CLASSIMAGELIST_DATA imagelist
    = new SP_CLASSIMAGELIST_DATA();
    if (result != CR_SUCCESS)
    {
    return (int)result;
    }
    resNam
    = SetupDiClassNameFromGuidA(ref ClassGuid, ClassName, RequiredSize, ref RequiredSize);
    if (RequiredSize > 0)
    {
    ClassName.Capacity
    = (int)RequiredSize;
    resNam
    = SetupDiClassNameFromGuidA(ref ClassGuid, ClassName, RequiredSize, ref RequiredSize);
    }
    NewDeviceInfoSet
    = SetupDiGetClassDevsA(ref ClassGuid, 0, IntPtr.Zero, DIGCF_PRESENT);
    if (NewDeviceInfoSet.ToInt32() == -1)
    {
    DevicePresent
    = false;
    return 0;
    }

    UInt32 numD
    = 0;
    DeviceInfoData.cbSize
    = 28;
    DeviceInfoData.DevInst
    = 0;
    DeviceInfoData.ClassGuid
    = System.Guid.Empty;
    DeviceInfoData.Reserved
    = 0;

    Boolean res1
    = SetupDiEnumDeviceInfo(
    NewDeviceInfoSet,
    numD,
    DeviceInfoData);

    if (!res1)
    {
    DevicePresent
    = false;
    return 0;
    }
    SetupDiDestroyDeviceInfoList(NewDeviceInfoSet);
    IntPtr KeyClass
    = SetupDiOpenClassRegKeyExA(
    ref ClassGuid, MAXIMUM_ALLOWED, DIOCR_INSTALLER, IntPtr.Zero, 0);
    if (KeyClass.ToInt32() == -1)
    {
    DevicePresent
    = false;
    return 0;
    }
    UInt32 sizeB
    = MAX_SIZE_DEVICE_DESCRIPTION;
    ClassDescription.Capacity
    = MAX_SIZE_DEVICE_DESCRIPTION;
    UInt32 res
    = RegQueryValueA(KeyClass, 0, ClassDescription, ref sizeB);
    if (res != 0) ClassDescription = new StringBuilder(""); //No device description
    DevicePresent = true;
    ClassesGuid
    = DeviceInfoData.ClassGuid;
    return 0;
    }
    }

    再取设备信息:

     class DeviceInfo
    {
    private const int DIGCF_PRESENT = (0x00000002);
    private const int MAX_DEV_LEN = 1000;
    private const int SPDRP_FRIENDLYNAME = (0x0000000C);
    private const int SPDRP_DEVICEDESC = (0x00000000);

    [StructLayout(LayoutKind.Sequential)]
    private class SP_DEVINFO_DATA
    {
    public int cbSize;
    public Guid ClassGuid;
    public int DevInst;
    public ulong Reserved;
    };
    [DllImport(
    "setupapi.dll")]
    private static extern Boolean SetupDiClassGuidsFromNameA(string ClassN, ref Guid guids, UInt32 ClassNameSize, ref UInt32 ReqSize);

    [DllImport(
    "setupapi.dll")]
    private static extern IntPtr SetupDiGetClassDevsA(ref Guid ClassGuid, UInt32 Enumerator, IntPtr hwndParent, UInt32 Flags);

    [DllImport(
    "setupapi.dll")]
    private static extern Boolean SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet, UInt32 MemberIndex, SP_DEVINFO_DATA DeviceInfoData);

    [DllImport(
    "setupapi.dll")]
    private static extern Boolean SetupDiDestroyDeviceInfoList(IntPtr DeviceInfoSet);

    [DllImport(
    "setupapi.dll")]
    private static extern Boolean SetupDiGetDeviceRegistryPropertyA(IntPtr DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, UInt32 Property, UInt32 PropertyRegDataType, StringBuilder PropertyBuffer, UInt32 PropertyBufferSize, IntPtr RequiredSize);

    /// <summary>
    /// 通过设备类型枚举设备信息
    /// </summary>
    /// <param name="DeviceIndex"></param>
    /// <param name="ClassName"></param>
    /// <param name="DeviceName"></param>
    /// <returns></returns>
    public static int EnumerateDevices(UInt32 DeviceIndex, string ClassName, StringBuilder DeviceName)
    {
    UInt32 RequiredSize
    = 0;
    Guid guid
    = Guid.Empty;
    Guid[] guids
    = new Guid[1];
    IntPtr NewDeviceInfoSet;
    SP_DEVINFO_DATA DeviceInfoData
    = new SP_DEVINFO_DATA();


    bool res = SetupDiClassGuidsFromNameA(ClassName, ref guids[0], RequiredSize, ref RequiredSize);
    if (RequiredSize == 0)
    {
    //类型不正确
    DeviceName = new StringBuilder("");
    return -2;
    }

    if (!res)
    {
    guids
    = new Guid[RequiredSize];
    res
    = SetupDiClassGuidsFromNameA(ClassName, ref guids[0], RequiredSize, ref RequiredSize);

    if (!res || RequiredSize == 0)
    {
    //类型不正确
    DeviceName = new StringBuilder("");
    return -2;
    }
    }

    //通过类型获取设备信息
    NewDeviceInfoSet = SetupDiGetClassDevsA(ref guids[0], 0, IntPtr.Zero, DIGCF_PRESENT);
    if (NewDeviceInfoSet.ToInt32() == -1)
    {
    //设备不可用
    DeviceName = new StringBuilder("");
    return -3;
    }

    DeviceInfoData.cbSize
    = 28;
    //正常状态
    DeviceInfoData.DevInst = 0;
    DeviceInfoData.ClassGuid
    = System.Guid.Empty;
    DeviceInfoData.Reserved
    = 0;

    res
    = SetupDiEnumDeviceInfo(NewDeviceInfoSet,
    DeviceIndex, DeviceInfoData);
    if (!res)
    {
    //没有设备
    SetupDiDestroyDeviceInfoList(NewDeviceInfoSet);
    DeviceName
    = new StringBuilder("");
    return -1;
    }



    DeviceName.Capacity
    = MAX_DEV_LEN;
    if (!SetupDiGetDeviceRegistryPropertyA(NewDeviceInfoSet, DeviceInfoData,
    SPDRP_FRIENDLYNAME,
    0, DeviceName, MAX_DEV_LEN, IntPtr.Zero))
    {
    res
    = SetupDiGetDeviceRegistryPropertyA(NewDeviceInfoSet,
    DeviceInfoData, SPDRP_DEVICEDESC,
    0, DeviceName, MAX_DEV_LEN, IntPtr.Zero);
    if (!res)
    {
    //类型不正确
    SetupDiDestroyDeviceInfoList(NewDeviceInfoSet);
    DeviceName
    = new StringBuilder("");
    return -4;
    }
    }
    return 0;
    }
    }
     
  • 相关阅读:
    Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.
    用户画像——“打标签”
    python replace函数替换无效问题
    python向mysql插入数据一直报TypeError: must be real number,not str
    《亿级用户下的新浪微博平台架构》读后感
    【2-10】标准 2 维表问题
    【2-8】集合划分问题(给定要分成几个集合)
    【2-7】集合划分问题
    【2-6】排列的字典序问题
    【2-5】有重复元素的排列问题
  • 原文地址:https://www.cnblogs.com/top5/p/1635271.html
Copyright © 2011-2022 走看看