在C#中使用SetupApi获取设备的Device ID。
时间: 2024-02-18 19:02:29 浏览: 192
根据地址返回经纬度
获取设备的 Device ID 可以使用 SetupApi 库中的 SetupDiGetDeviceInstanceId 函数来实现。
您可以按照以下步骤进行操作:
1. 引入 SetupApi 库:
```csharp
using System.Runtime.InteropServices;
using System.Text;
```
2. 定义 SetupApi 函数:
```csharp
[DllImport("setupapi.dll", CharSet = CharSet.Unicode)]
public static extern bool SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet, uint MemberIndex, ref SP_DEVINFO_DATA DeviceInfoData);
[DllImport("setupapi.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid, string Enumerator, IntPtr hwndParent, uint Flags);
[DllImport("setupapi.dll", CharSet = CharSet.Unicode)]
public static extern bool SetupDiDestroyDeviceInfoList(IntPtr DeviceInfoSet);
[DllImport("setupapi.dll", CharSet = CharSet.Unicode)]
public static extern bool SetupDiGetDeviceInstanceId(IntPtr DeviceInfoSet, ref SP_DEVINFO_DATA DeviceInfoData, StringBuilder DeviceInstanceId, int DeviceInstanceIdSize, out int RequiredSize);
```
3. 创建获取设备 Device ID 的方法:
```csharp
public static string GetDeviceID(Guid classGuid, int index)
{
IntPtr deviceInfoSet = SetupApi.SetupDiGetClassDevs(ref classGuid, null, IntPtr.Zero, SetupApi.DIGCF_PRESENT | SetupApi.DIGCF_PROFILE);
if (deviceInfoSet.ToInt64() == -1)
{
return "";
}
SP_DEVINFO_DATA deviceInfoData = new SP_DEVINFO_DATA();
deviceInfoData.cbSize = Marshal.SizeOf(deviceInfoData);
if (SetupApi.SetupDiEnumDeviceInfo(deviceInfoSet, (uint)index, ref deviceInfoData))
{
StringBuilder deviceInstanceId = new StringBuilder(256);
int requiredSize = 0;
if (SetupApi.SetupDiGetDeviceInstanceId(deviceInfoSet, ref deviceInfoData, deviceInstanceId, deviceInstanceId.Capacity, out requiredSize))
{
return deviceInstanceId.ToString();
}
}
SetupApi.SetupDiDestroyDeviceInfoList(deviceInfoSet);
return "";
}
```
4. 调用 GetDeviceID 方法:
```csharp
Guid classGuid = new Guid("YOUR_DEVICE_CLASS_GUID");
int index = 0;
string deviceID = GetDeviceID(classGuid, index);
```
其中,YOUR_DEVICE_CLASS_GUID 需要替换成您想要获取 Device ID 的设备的类 GUID。您可以在设备管理器中找到设备的类 GUID。
另外,index 参数表示设备列表中设备的索引,从 0 开始。如果需要获取所有设备的 Device ID,可以使用一个循环来遍历设备列表,并调用 GetDeviceID 方法来获取每个设备的 Device ID。
阅读全文