ウィンドウを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
、WM_DEVICECHANGEメッセージの LParam で使用しています。
これは機能するはずですか?
またはさらに良い...接続時にデバイスの名前を取得する別の方法はありますか?
編集 (2010 年 2 月 5 日 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」と言いたいだけです(この場合のデバイスはこれです)。