c# - 如何从 DEV_BROADCAST_DEVICEINTERFACE 和设备实例 ID 获取友好的设备名称

标签 c# winapi guid device-instance-id

我已经用 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/

相关文章:

基于 web 发布配置文件的 c# 预处理器指令

c# - 如何测试窗口是否被拖动 C# WPF

winapi - 支持 ARM 上的 Windows 10 桌面应用程序 - MFC 和 COM 以及 OPOS 工作吗?

database - 使用什么类型的数据库记录id : long or guid?

sql - 如何在 SQL Server 中存储 token

c# - 跨应用程序相同 GUID 的影响

c# - 帮助我可以停止 wpf 网页浏览器弹出窗口吗?

c# - 挂接到 HttpModule 中的 Application_Start

c++ - 使用 dart 实现 winapi(SendInput) :ffi

c++ - UI自动化: AddAutomationEventHandler() returns E_INVALIDARG