Tüm sürücülere bir kontrol yapmalı ve VIDs/PID'den herhangi birinin belirli bir taneyle eşleşip eşleşmediğine bakmalıyım, eğer bu flash sürücünün sürücü harfini almam gerekiyorsa. Herkese teşekkürler! WMI bu işi mümkün olmalıdırC# içindeki USB Flash sürücülerinden VID/PID'yi nasıl alabilirim?
cevap
...
Sen System.Management dll bir başvuru eklemek zorunda olacak ve olması gerekir: "System.Management kullanarak;"
* Bu gibi görünen "Deviceıd" ne olduğunu: satır ...
CIM_DiskDrive için win32 Sınıf aşağıdaki parametrelere sahiptir MSDN itibarenusing System.Management;
// Get all the disk drives
ManagementObjectSearcher mosDisks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
// Loop through each object (disk) retrieved by WMI
foreach (ManagementObject moDisk in mosDisks.Get())
{
// Add the HDD to the list (use the Model field as the item's caption)
cmbHdd.Items.Add(moDisk["Model"].ToString());
}
private void cmbHdd_SelectedIndexChanged(object sender, EventArgs e)
{
// Get all the disk drives from WMI that match the Model name selected in the ComboBox
ManagementObjectSearcher mosDisks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE Model = '" + cmbHdd.SelectedItem + "'");
// Loop through the drives retrieved, although it should normally be only one loop going on here
foreach (ManagementObject moDisk in mosDisks.Get())
{
// Set all the fields to the appropriate values
lblType.Text = "Type: " + moDisk["MediaType"].ToString();
lblModel.Text = "Model: " + moDisk["Model"].ToString();
lblSerial.Text = "Serial: " + moDisk["SerialNumber"].ToString();
lblInterface.Text = "Interface: " + moDisk["InterfaceType"].ToString();
// The capacity in gigabytes is easily calculated
lblCapacity.Text = "Capacity: " + moDisk["Size"].ToString() + " bytes (" + Math.Round(((((double)Convert.ToDouble(moDisk["Size"])/1024)/1024)/1024), 2) + " GB)";
lblPartitions.Text = "Partitions: " + moDisk["Partitions"].ToString();
lblSignature.Text = "Signature: " + moDisk["Signature"].ToString();
lblFirmware.Text = "Firmware: " + moDisk["FirmwareRevision"].ToString();
lblCylinders.Text = "Cylinders: " + moDisk["TotalCylinders"].ToString();
lblSectors.Text = "Sectors: " + moDisk["TotalSectors"].ToString();
lblHeads.Text = "Heads: " + moDisk["TotalHeads"].ToString();
lblTracks.Text = "Tracks: " + moDisk["TotalTracks"].ToString();
lblBytesPerSect.Text = "Bytes per Sector: " + moDisk["BytesPerSector"].ToString();
lblSectorsPerTrack.Text = "Sectors per Track: " + moDisk["SectorsPerTrack"].ToString();
lblTracksPerCyl.Text = "Tracks per Cylinder: " + moDisk["TracksPerCylinder"].ToString();
}
}
... Ekran için Bottom, daha kapsamlı bir açıklama At Linki görün Eğer ... istediğiniz
class Win32_DiskDrive : CIM_DiskDrive
{
uint16 Availability;
uint32 BytesPerSector;
uint16 Capabilities[];
string CapabilityDescriptions[];
string Caption;
string CompressionMethod;
uint32 ConfigManagerErrorCode;
boolean ConfigManagerUserConfig;
string CreationClassName;
uint64 DefaultBlockSize;
string Description;
string DeviceID;
boolean ErrorCleared;
string ErrorDescription;
string ErrorMethodology;
string FirmwareRevision;
uint32 Index;
datetime InstallDate;
string InterfaceType;
uint32 LastErrorCode;
string Manufacturer;
uint64 MaxBlockSize;
uint64 MaxMediaSize;
boolean MediaLoaded;
string MediaType;
uint64 MinBlockSize;
string Model;
string Name;
boolean NeedsCleaning;
uint32 NumberOfMediaSupported;
uint32 Partitions;
string PNPDeviceID;
uint16 PowerManagementCapabilities[];
boolean PowerManagementSupported;
uint32 SCSIBus;
uint16 SCSILogicalUnit;
uint16 SCSIPort;
uint16 SCSITargetId;
uint32 SectorsPerTrack;
string SerialNumber;
uint32 Signature;
uint64 Size;
string Status;
uint16 StatusInfo;
string SystemCreationClassName;
string SystemName;
uint64 TotalCylinders;
uint32 TotalHeads;
uint64 TotalSectors;
uint64 TotalTracks;
uint32 TracksPerCylinder;
};
Alınan kodun
Üst Porsiyon:
http://www.geekpedia.com/tutorial233_Getting-Disk-Drive-Information-using-WMI-and-Csharp.html
Sadece cihazın bağlı olduğunu kontrol etmeniz gerekiyorsa sorun çok daha basit. DBT_DEVICEARRIVAL
olayını kontrol etmeniz gerekiyor. Bir Windows Forms uygulaması oluşturuyorsanız, bu IMessageFilter
arayüzünü uygulayarak ve Application
AddMessageFiler
işlevine ileterek yapılabilir. Bir Form uygulamasını kullanmıyorsanız, NativeWindow
'dan bir sınıf türetmeniz ve WndProc'u geçersiz kılmanız gerekir. Windows ileti kuyruğuna eklenecek şekilde CreateHandle numaralı telefonu aramayı unutmayın.
DBT_DEVICEARRIVAL
'u alma yoluna sahip olduğunuzda, onu ayrıştırmanız gerekecektir. Zaten ben sadece WMI method kullanarak öneriyoruz bağlı tüm cihazları sıralamak gerekirse
// Constants from from Dbt.h
const int WM_DEVICECHANGE = 0x219;
const int DBT_DEVICEARRIVAL = 0x8000;
const uint DBT_DEVTYP_DEVICEINTERFACE = 0x05;
const Guid GUID_DEVINTERFACE_USB_DEVICE = new Guid("A5DCBF10-6530-11D2-901F-00C04FB951ED");
bool PreFilterMessage(ref Message m)
{
if(m.Msg == case WM_DEVICECHANGE && m.WParam == DBT_DEVICEARRIVAL)
var broadcast = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(pnt, typeof(DEV_BROADCAST_HDR));
if(broadcast.dbch_DeviceType == DBT_DEVTYP_DEVICEINTERFACE)
{
var devInterface = (DEV_BROADCAST_DEVICEINTERFACE)Marshal.PtrToStructure(pnt, typeof(DEV_BROADCAST_DEVICEINTERFACE));
if(devInterface.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE)
{
// devInterface.dbcc_name will contain the VID and PID for example:
// \\?\USB#Vid_067b&Pid_2517#6&12115ad4&2&1#{GUID}
DoSomthingSpecial(devInterface.dbcc_name);
}
}
}
return false;
}
[StructLayout(LayoutKind.Sequential)]
struct DEV_BROADCAST_HDR {
public uint dbch_Size;
public uint dbch_DeviceType;
public uint dbch_Reserved;
}
[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;
}
(o test edilmemiştir yüzden şu bir IDE içinde yazılmamıştır). WMI olmadan nasıl yapılacağını görmek isterseniz, Windows Driver Development Kit numaralı telefondan USBView kodunu kontrol edin, başlamanıza yardımcı olabilir.
public static bool GetDriveVidPid(string szDriveName, ref ushort wVID, ref ushort wPID)
{
bool bResult = false;
string szSerialNumberDevice = null;
ManagementObject oLogicalDisk = new ManagementObject("Win32_LogicalDisk.DeviceID='" + szDriveName.TrimEnd('\\') + "'");
foreach(ManagementObject oDiskPartition in oLogicalDisk.GetRelated("Win32_DiskPartition"))
{
foreach(ManagementObject oDiskDrive in oDiskPartition.GetRelated("Win32_DiskDrive"))
{
string szPNPDeviceID = oDiskDrive["PNPDeviceID"].ToString();
if(!szPNPDeviceID.StartsWith("USBSTOR"))
throw new Exception(szDriveName + " ist kein USB-Laufwerk.");
string[] aszToken = szPNPDeviceID.Split(new char[] { '\\', '&' });
szSerialNumberDevice = aszToken[aszToken.Length - 2];
}
}
if(null != szSerialNumberDevice)
{
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(@"root\CIMV2", "Select * from Win32_USBHub");
foreach(ManagementObject oResult in oSearcher.Get())
{
object oValue = oResult["DeviceID"];
if(oValue == null)
continue;
string szDeviceID = oValue.ToString();
string[] aszToken = szDeviceID.Split(new char[] { '\\' });
if(szSerialNumberDevice != aszToken[aszToken.Length - 1])
continue;
int nTemp = szDeviceID.IndexOf(@"VID_");
if(0 > nTemp)
continue;
nTemp += 4;
wVID = ushort.Parse(szDeviceID.Substring(nTemp, 4), System.Globalization.NumberStyles.AllowHexSpecifier);
nTemp += 4;
nTemp = szDeviceID.IndexOf(@"PID_", nTemp);
if(0 > nTemp)
continue;
nTemp += 4;
wPID = ushort.Parse(szDeviceID.Substring(nTemp, 4), System.Globalization.NumberStyles.AllowHexSpecifier);
bResult = true;
break;
}
}
return bResult;
}
- 1. Çıkarılabilir sürücüyü (ör. USB flash sürücü) algıla C/C++
- 2. C# içindeki bir dizeden bitleri nasıl alabilirim?
- 3. Git bash USB flash sürücüleri tanımlayamıyor
- 4. nasıl alabilirim (takılı) tüm USB sürücüler
- 5. C'ye takılı USB flash sürücünün boyutunu nasıl bulabilirim?
- 6. Bir USB Flash Belleğini yazılımla nasıl yeniden algılarsınız?
- 7. C# içindeki bir XML web hizmetinden nasıl bir değer alabilirim?
- 8. İmlecin sütun numarasını C# içindeki bir TextBox'a nasıl alabilirim?
- 9. C# içindeki tüm yazdırılabilir karakterlerin listesini nasıl alabilirim?
- 10. Bir USB aygıtının C
- 11. java.util.Set içindeki bir öğenin endeksini nasıl alabilirim
- 12. Bir USB cihazını C# 'den nasıl çalıştırabilirim?
- 13. C# USB aygıtını algıla ClassCode (usb aygıt türü)
- 14. USB aygıtının ürün dizesini alın (C#/C++)
- 15. C# - "Herkes" kullanıcısını nasıl alabilirim?
- 16. Android'de harici USB belleği nasıl okunur/yazılır?
- 17. Flash nasıl çalışır?
- 18. USB cihazlarını program aracılığıyla bağlayıp çıkarın
- 19. C# içindeki özel ilkeller?
- 20. C'deki USB Aygıtı Seri numarasını okuyun C#
- 21. Javascript'te bir dizinin içindeki min öğelerini nasıl alabilirim?
- 22. iphone sdk içindeki .plist değerlerini nasıl ekleyebilir ve alabilirim
- 23. javascript'te redis içindeki tüm anahtar ve değerleri nasıl alabilirim?
- 24. JSTL kullanarak jsp içindeki bir listenin elemanını nasıl alabilirim?
- 25. Belirli bir pencere boyutu içindeki tüm bigramları nasıl alabilirim?
- 26. C# içindeki bir tamsayıya nasıl başvuru yapılır?
- 27. C# içindeki öğelerin bir listesini nasıl eklenir?
- 28. C# 4.0 app.config içindeki bölümleri nasıl kullanırsınız?
- 29. C# içindeki String'in son karakteri nasıl kaldırılır?
- 30. RichTextBox C# içindeki metin nasıl hizalanır?
WMI, toplam overkill olduğundan, bu OP sorusu için çok daha iyi bir çözümdür. –