Как получить дружественное имя устройства от DEV_BROADCAST_DEVICEINTERFACE и идентификатора Экземпляра Устройства

Я зарегистрировал окно в 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;
}

И я использую Marshal.PtrToStructure на LParam сообщения WM_DEVICECHANGE.

Это должно работать?

Или еще лучше... Существует ли альтернативный способ получить название устройства после соединения?

РЕДАКТИРОВАНИЕ (05.02.2010 20:56 GMT):

Я узнал, как заставить 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;
}

но мне все еще нужен способ получить "Дружественное" имя от того, что является интервалом dbcc_name. Это похоже на следующее:

\? \USB#VID_05AC&PID_1294&MI_00#0# {6bdd1fc6-810f-11d0-bec7-08002be2092f}

И я действительно просто хочу, чтобы это сказало "Apple iPhone" (который является тем, что устройство в этом случае).

11
задан snicker 5 February 2010 в 21:07
поделиться

2 ответа

Ну, как отмечалось выше, я узнал, как заставить 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;
}
10
ответ дан 3 December 2019 в 09:20
поделиться

Вероятно, вам нужно немного изменить это

[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 StringBuilder dbcc_name;
}

Установите dbcc_size на 255 и создайте StringBuilder, как показано ниже:

DEV_BROADCAST_DEVICEINTERFACE dbd = new DEV_BROADCAST_DEVICEINTERFACE;
dbd.dbcc_size = 255;
dbd.dbcc_name = new StringBuilder(dbd.dbcc_size);

Затем передайте эту структуру, значение dbcc_name должен быть заполнен.

Правка: после комментария snicker ... Я подумал об этом по-другому ...

public struct DEV_BROADCAST_DEVICEINTERFACE
{
    public int dbcc_size;
    public int dbcc_devicetype;
    public int dbcc_reserved;
    public Guid dbcc_classguid;
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 255, ArraySubType = System.Runtime.InteropServices.UnmanagedType.LPArray)]
    public string dbcc_name;
}

Установите dbcc_size на 255 и возьмите его из там ...

Редактировать №2: Это интересно ... Я не совсем уверен, я нашел эту статью, которая использует RegisterDeviceNotification в Codeproject , и она использует другой способ RegisterDeviceNotification, в котором структура упорядочивается в IntPtr и используется для вызова API ...

0
ответ дан 3 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: