遍历设备管理器的设备

源自:http://dev.csdn.net/develop/article/48/48400.shtm

using System;
using System.Runtime.InteropServices;
using System.Text;


namespace DevClasses
{
 
/// <summary>
 
/// Summary description for Class.
 
/// </summary>

 class DeviceClasses
 
{
  
/// <summary>
  
/// The main entry point for the application.
  
/// </summary>

  public const int MAX_NAME_PORTS=7;
  
public const int RegDisposition_OpenExisting=(0x00000001); 
  
// open key only if exists
  public const int CM_REGISTRY_HARDWARE=(0x00000000);

  
public const int CR_SUCCESS = (0x00000000);
  
public const int CR_NO_SUCH_VALUE = (0x00000025);
  
public const int CR_INVALID_DATA = (0x0000001F);
  
public const int DIGCF_PRESENT = (0x00000002);
  
public const int DIOCR_INSTALLER = (0x00000001);
  
// MaximumAllowed access type to Reg.
  public const int MAXIMUM_ALLOWED = (0x02000000);
  [StructLayout(LayoutKind.Sequential)]

   
public class SP_DEVINFO_DATA
  
{
   
public int cbSize;
   
public Guid ClassGuid;
   
public int DevInst; // DEVINST handle
   public ulong Reserved;
  }
;


  [DllImport(
"cfgmgr32.dll")]
  
public static extern UInt32
   CM_Open_DevNode_Key(IntPtr dnDevNode, UInt32 samDesired, 
   UInt32 ulHardwareProfile,
   UInt32 Disposition,IntPtr phkDevice, UInt32 ulFlags);

  [DllImport(
"cfgmgr32.dll")]
  
public static extern UInt32
   CM_Enumerate_Classes(UInt32 ClassIndex,
ref Guid ClassGuid, UInt32 Params);

  [DllImport(
"setupapi.dll")]//
  public static extern Boolean
   SetupDiClassNameFromGuidA(
ref Guid ClassGuid,
   StringBuilder ClassName, 
//char * ?
   UInt32 ClassNameSize, ref UInt32 RequiredSize);

  [DllImport(
"setupapi.dll")]
  
public static extern IntPtr
   SetupDiGetClassDevsA(
ref Guid ClassGuid, UInt32 Enumerator,
   IntPtr  hwndParent, UInt32 Flags);

  [DllImport(
"setupapi.dll")]
  
public static extern Boolean
   SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet, UInt32 MemberIndex,
   
ref SP_DEVINFO_DATA  DeviceInfoData);

  [DllImport(
"setupapi.dll")]
  
public static extern Boolean
   SetupDiDestroyDeviceInfoList(IntPtr DeviceInfoSet);

  [DllImport(
"setupapi.dll")]
  
public static extern IntPtr
   SetupDiGetClassDevsA(
ref Guid ClassGuid, UInt32 samDesired,
   UInt32 Flags, 
ref string hwndParent, IntPtr Reserved);

  [DllImport(
"setupapi.dll")]
  
public static extern IntPtr
   SetupDiOpenClassRegKeyExA(
   
ref Guid ClassGuid, UInt32 samDesired, int Flags, IntPtr MachineName,
   UInt32 Reserved);

  [DllImport(
"advapi32.dll")]
  
public static extern UInt32
   RegQueryValueA(IntPtr KeyClass,UInt32 SubKey,
   StringBuilder ClassDescription,
ref UInt32 sizeB);


  [DllImport(
"user32.dll")]
  
public static extern Boolean
   CharToOem(String lpszSrc, StringBuilder lpszDst);

  
public static int EnumerateClasses(UInt32 ClassIndex, 
   
ref StringBuilder ClassName, StringBuilder ClassDescription, ref string id,
   
ref bool DevicePresent)
  
{
   Guid ClassGuid
=Guid.Empty;

   IntPtr NewDeviceInfoSet;
   SP_DEVINFO_DATA DeviceInfoData;
   UInt32 result;
   StringBuilder name
=new StringBuilder("");
   
bool resNam=false;
   UInt32 RequiredSize
=0;

   IntPtr ptr;

   result 
= CM_Enumerate_Classes(ClassIndex, ref ClassGuid,0);


   ClassName
=new StringBuilder("");
   DevicePresent
=false;
   
//incorrect device class:
   if(result == CR_INVALID_DATA)
   
{
    
return -2;
   }

   
//device class is absent
   if(result == CR_NO_SUCH_VALUE)
   
{
    
return -1;
   }

   
//bad param. - fatal error
   if(result != CR_SUCCESS)
   
{
    
return -3;
   }



   name.Capacity
=0;
   resNam
=SetupDiClassNameFromGuidA(ref ClassGuid,name,RequiredSize,ref RequiredSize);
   
if(RequiredSize > 0)
   
{
    name.Capacity
=(int)RequiredSize;
    resNam
=SetupDiClassNameFromGuidA(ref ClassGuid,name,RequiredSize,ref RequiredSize);

   }


   NewDeviceInfoSet
=SetupDiGetClassDevsA(ref ClassGuid,0,IntPtr.Zero,DIGCF_PRESENT);

   
if(NewDeviceInfoSet.ToInt32() == -1)
   
{
     DevicePresent
=false;
    ClassName
=name;
    id
=ClassGuid.ToString();
    
return 0;}


   IntPtr KeyClass
=SetupDiOpenClassRegKeyExA(
    
ref ClassGuid, MAXIMUM_ALLOWED, DIOCR_INSTALLER,IntPtr.Zero,0);
   
if(KeyClass.ToInt32() == -1)
   
{
     DevicePresent
=false;
    ClassName
=name;
    id
=ClassGuid.ToString();
    
return 0;}



   UInt32 sizeB
=1000;
    
   StringBuilder CD
=new StringBuilder("");
   ClassDescription.Capacity
=1000;
  
   UInt32 res
=RegQueryValueA(KeyClass,0,ClassDescription,ref sizeB);


   
if(res != 0)ClassDescription=new StringBuilder("");
   SetupDiDestroyDeviceInfoList(NewDeviceInfoSet);
   ClassName
=name;
   id
=ClassGuid.ToString();
   DevicePresent
=true;

   
return 0;

  }


  [STAThread]
  
static void Main(string[] args)
  
{
   StringBuilder classes
=new StringBuilder("");
   StringBuilder classesDescr
=new StringBuilder("");

   StringBuilder classesDescrOEM
=new StringBuilder("");
   classesDescrOEM.Capacity
=1000;
   Boolean DevExist
=false;
   UInt32 i
=0;
   
string id="";
   
while(true)
   
{

    
int res=EnumerateClasses(i,ref classes,classesDescr,ref   id ,ref DevExist);
    
if(res == -1)break;
    
++i;
    
if(res < -1 || !DevExist)continue;
    Console.WriteLine(
"ClassName={0}, Description={1},id={2}",classes,classesDescr,id);
   }

   
return;
  }

 }

}
posted @ 2006-08-18 22:22  Bireyou  阅读(615)  评论(0编辑  收藏  举报