Итак, я думал, что буду включать окончательный ответ здесь, чтобы вам не нужно было разбираться в этом сообщении. Большое спасибо Симону Моуриру за то, что нашли время, чтобы понять это.
МОЙ РАБОЧИЙ КОД
try
{
//Get a list of available devices attached to the USB hub
List<string> disks = new List<string>();
var usbDevices = GetUSBDevices();
//Enumerate the USB devices to see if any have specific VID/PID
foreach (var usbDevice in usbDevices)
{
if (usbDevice.DeviceID.Contains(USB_PID) && usbDevice.DeviceID.Contains(USB_VID))
{
foreach (string name in usbDevice.GetDiskNames())
{
//Open dialog to show file names
textbox1.Text = name.ToString();
}
}
}
Так что просто используйте GetUSBDevices
из моего первоначального вопроса, а затем включите два класса, показанные в ответ Саймона Моурира, и это должно быть хорошо!
ОРИГИНАЛЬНЫЙ ВОПРОС
Я знаю, что этот вопрос задан раньше (см. здесь), но ни один из них не имеет подтвержденного ответа, и я пробовал все предлагаемые ответы. К сожалению, эти темы давно мертвы, и я надеялся, что кто-то может дать лучший ответ здесь.
До сих пор у меня есть две "исходные точки", каждая из которых я покажу ниже.
ВАРИАНТ 1: (получает идентификатор VID/PID, но не букву диска)
У меня есть встроенное устройство, с которым я подключаюсь через приложение. У меня есть код, который успешно сканирует любые USB-устройства и проверяет VID/PID
. Я успешно обнаружил свое устройство, но я понятия не имею, как получить букву диска. Кто-нибудь может мне помочь? Я чувствую, что могу добавить еще одну строку в class
, но когда я пройду через Device Manager
, я не могу найти там никакого свойства, которое описывает букву диска.
Спасибо!
Я включу свой код ниже.
private void tsDownload_Click(object sender, EventArgs e)
{
var usbDevices = GetUSBDevices();
foreach (var usbDevice in usbDevices)
{
if (usbDevice.DeviceID.Contains(USB_PID) && usbDevice.DeviceID.Contains(USB_VID))
{
//Find drive letter here
}
}
}
где эти функции:
static List<USBDeviceInfo> GetUSBDevices()
{
List<USBDeviceInfo> devices = new List<USBDeviceInfo>();
ManagementObjectCollection collection;
using (var searcher = new ManagementObjectSearcher(@"Select * From Win32_USBHub"))
collection = searcher.Get();
foreach (var device in collection)
{
devices.Add(new USBDeviceInfo(
(string)device.GetPropertyValue("DeviceID"),
(string)device.GetPropertyValue("PNPDeviceID"),
(string)device.GetPropertyValue("Description")
));
}
collection.Dispose();
return devices;
}
а класс:
class USBDeviceInfo
{
public USBDeviceInfo(string deviceID, string pnpDeviceID, string description)
{
this.DeviceID = deviceID;
this.PnpDeviceID = pnpDeviceID;
this.Description = description;
}
public string DeviceID { get; private set; }
public string PnpDeviceID { get; private set; }
public string Description { get; private set; }
}
ВАРИАНТ 2: (получите букву диска, но не VID/PID)
foreach (ManagementObject drive in new ManagementObjectSearcher("select * from Win32_DiskDrive where InterfaceType='USB'").Get())
{
foreach(ManagementObject partition in new ManagementObjectSearcher("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + drive["DeviceID"] + "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition").Get())
{
foreach (ManagementObject disk in new ManagementObjectSearcher("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" + partition["DeviceID"] + "'} WHERE AssocClass = Win32_LogicalDiskToPartition").Get())
{
textBox1.Text = disk["Name"].ToString();
}
}
}
Я собираюсь угадать, что VID/PID находится в одном из свойств объекта disk
, но я просто не могу найти, какой из них.