我已经用 RegisterDeviceNotification 注册了一个窗口并能成功收到DEV_BROADCAST_DEVICEINTERFACE消息。但是,返回的结构中的 dbcc_name
字段始终为空。我的结构是这样定义的:
[StructLayout(LayoutKind.Sequential)]
public struct DEV_BROADCAST_DEVICEINTERFACE
{
public int dbcc_size;
public int dbcc_devicetype;
public int dbcc_reserved;
public Guid dbcc_classguid;
[MarshalAs(UnmanagedType.LPStr)]
public string dbcc_name;
}
我在 WM_DEVICECHANGE 的 LParam 上使用 Marshal.PtrToStructure
消息。
这应该有效吗?
或者更好...有没有其他方法可以在连接时获取设备名称?
编辑(02/05/2010 20:56GMT):
我发现如何通过这样做来填充 dbcc_name 字段:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct DEV_BROADCAST_DEVICEINTERFACE
{
public int dbcc_size;
public int dbcc_devicetype;
public int dbcc_reserved;
public Guid dbcc_classguid;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=255)]
public string dbcc_name;
}
但我仍然需要一种方法来从 int dbcc_name 中获取“友好”名称。它看起来像下面这样:
\?\USB#VID_05AC&PID_1294&MI_00#0#{6bdd1fc6-810f-11d0-bec7-08002be2092f}
我真的只是想让它说“Apple iPhone”(在这种情况下就是设备)。
最佳答案
好吧,如上所述,我发现了如何让 dbcc_name 正确填充。我发现这是获取设备名称的最简单方法:
private static string GetDeviceName(DEV_BROADCAST_DEVICEINTERFACE dvi)
{
string[] Parts = dvi.dbcc_name.Split('#');
if (Parts.Length >= 3)
{
string DevType = Parts[0].Substring(Parts[0].IndexOf(@"?\") + 2);
string DeviceInstanceId = Parts[1];
string DeviceUniqueID = Parts[2];
string RegPath = @"SYSTEM\CurrentControlSet\Enum\" + DevType + "\\" + DeviceInstanceId + "\\" + DeviceUniqueID;
RegistryKey key = Registry.LocalMachine.OpenSubKey(RegPath);
if (key != null)
{
object result = key.GetValue("FriendlyName");
if (result != null)
return result.ToString();
result = key.GetValue("DeviceDesc");
if (result != null)
return result.ToString();
}
}
return String.Empty;
}
关于c# - 如何从 DEV_BROADCAST_DEVICEINTERFACE 和设备实例 ID 获取友好的设备名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2208722/