Как обнаружить USB Плеер? - C#
Формулировка задачи:
Здравствуйте!
Подскажите пожалуйста, как обнаружить все устройства подключенные в USB (в частности плеер)?
Я искренне думал, что код
выдаст список всех подключенных устройств (из которых потом можно выбрать нужные), но похоже это не совсем так... Не обнаружаються плеер, телефон, камера и прочая перефирия, подключенная к usb. Как это исправить?
DriveInfo[] AllDrives = DriveInfo.GetDrives();
foreach (DriveInfo driveinfo in AllDrives)
{
listBox1.Items.Add(driveinfo.Name);
}Решение задачи: «Как обнаружить USB Плеер?»
textual
Листинг программы
private const int WM_DEVICECHANGE = 0x0219;
private const int DBT_DEVICEREMOVECOMPLETE = 0x8004;
private const int DBT_DEVICEARRIVAL = 0x8000;
private const uint DBT_DEVTYP_VOLUME = 0x00000002;
[StructLayout(LayoutKind.Sequential)]
private struct DEV_BROADCAST_HDR
{
public uint dbch_size;
public uint dbch_devicetype;
public uint dbch_reserved;
}
[StructLayout(LayoutKind.Sequential)]
private struct DEV_BROADCAST_VOLUME
{
public uint dbcv_size;
public uint dbcv_devicetype;
public uint dbcv_reserved;
public uint dbcv_unitmask;
public ushort dbcv_flags;
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_DEVICECHANGE)
{
switch (m.WParam.ToInt32())
{
case DBT_DEVICEARRIVAL:
DEV_BROADCAST_HDR dbhARRIVAL = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR));
if (dbhARRIVAL.dbch_devicetype == DBT_DEVTYP_VOLUME)
{
DEV_BROADCAST_VOLUME dbv = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME));
BitArray bArray = new BitArray(new byte[]
{
(byte)(dbv.dbcv_unitmask & 0x00FF),
(byte)((dbv.dbcv_unitmask & 0xFF00) >> 8),
(byte)((dbv.dbcv_unitmask & 0xFF0000) >> 16),
(byte)((dbv.dbcv_unitmask & 0xFF000000) >> 24)
});
int DriveLetter = Char.ConvertToUtf32("A", 0);
for (int i = 0; i < bArray.Length; i++)
{
if (bArray.Get(i))
Connect(Char.ConvertFromUtf32(DriveLetter));
DriveLetter += 1;
}
}
break;
case DBT_DEVICEREMOVECOMPLETE:
DEV_BROADCAST_HDR dbhREMOVECOMPLETE = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR));
if (dbhREMOVECOMPLETE.dbch_devicetype == DBT_DEVTYP_VOLUME)
{
DEV_BROADCAST_VOLUME dbv = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME));
BitArray bArray = new BitArray(new byte[]
{
(byte)(dbv.dbcv_unitmask & 0x00FF),
(byte)((dbv.dbcv_unitmask & 0xFF00) >> 8),
(byte)((dbv.dbcv_unitmask & 0xFF0000) >> 16),
(byte)((dbv.dbcv_unitmask & 0xFF000000) >> 24)
});
int driveLetter = Char.ConvertToUtf32("A", 0);
for (int i = 0; i < bArray.Length; i++)
{
if (bArray.Get(i))
{
this.ShowInTaskbar = false;
this.Hide();
}
driveLetter += 1;
}
}
break;
}
}
}
string DriveName = "";
private void Connect(string Dir)
{
DriveName = Dir + @":\";
this.Text = "Съёмный диск (" + Dir + @":\)";
this.ShowInTaskbar = true;
this.Show();
}