したがって、この投稿を理解する必要がないように、ここに最終的な回答を含めることにしました。これを理解するために時間を割いてくれた Simon Mourier に大いに感謝します。
私の作業コード
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
、元の質問から使用して、Simon Mourierの回答で示されている2つのクラスを含めるだけで、うまくいくはずです!
元の質問
この質問が以前に尋ねられたことは知っていますが (こちらを参照)、いずれも確認済みの回答がなく、提案された回答をすべて試しました。残念ながら、これらのスレッドは長い間死んでおり、誰かがここでより良い答えを出せることを望んでいました.
これまでのところ、2 つの「出発点」があり、それぞれを以下に示します。
オプション 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
オブジェクト プロパティの 1 つにあると推測しますが、どれを見つけることができません。