2012-04-07 15 views

risposta

1

WMI dovrebbe essere in grado di gestire questo ...

Si dovrà aggiungere un riferimento alla DLL System.Management e sarà necessario avere il: "usando System.Management;" linea ... Vedi il link in fondo per gli screenshots, spiegazione più approfondita ...

using 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(); 

    } 

} 

Da MSDN la classe Win32 per CIM_DiskDrive ha i seguenti parametri:

* Sembra che "DeviceID" è ciò che si vuole ...

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; 
}; 

parte superiore del Codice Tratto da:

http://www.geekpedia.com/tutorial233_Getting-Disk-Drive-Information-using-WMI-and-Csharp.html

1

Se è solo necessario verificare quando il dispositivo è collegato, il problema è molto più semplice. È necessario verificare l'evento DBT_DEVICEARRIVAL. Se si sta creando un'applicazione Windows Form, ciò può essere fatto implementando l'interfaccia IMessageFilter e passandola alla funzione AddMessageFiler in Application. Se non si utilizza un'app Forms, sarà necessario derivare una classe da NativeWindow e ignorare WndProc. Ricordare di chiamare CreateHandle in modo che venga aggiunto alla coda dei messaggi di Windows.

Una volta ottenuto il modo di ricevere DBT_DEVICEARRIVAL, sarà necessario analizzarlo. (Di seguito, non è stato scritto in un IDE in modo che non è stato testato)

// 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; 
} 

Se è necessario enumerare tutti i dispositivi già connessi vorrei solo consiglia di utilizzare il WMI method. Se vuoi vedere come farlo senza WMI, controlla il codice su USBView nello Windows Driver Development Kit, potrebbe aiutarti a iniziare.

+0

Questa è la soluzione migliore per la domanda OP poiché WMI è eccessivo. –

1
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; 
} 
Problemi correlati