c# 获取移动硬盘信息、监听移动设备的弹出与插入事件
2013-09-27 19:06
621 查看
原文/article/6007539.html
备忘一下改功能,主要通过WMI来实现,对于监听外接设备的弹出和插入事件一开始使用IntPtrWndProc事件,但是当监听到改事件时,同过WMI来获取设备,有时候还不能获取到,因此还是使用WqlEventQuery来监听WMI的变化。下列是主要代码片段
1.获取硬盘的固件序列号,盘序列号(由系统指派的唯一ID),总容量,剩余容量,盘符,盘名称等信息
2.下列代码段用于监听新增或删除外接设备
//使用方法
watcher=newUsbDriverWatcher();
watcher.OnDeviceChanged+=watcher_OnDeviceChanged;
watcher.Start();
3、使用WndProc方法来监听外接设备变化的方法:
备忘一下改功能,主要通过WMI来实现,对于监听外接设备的弹出和插入事件一开始使用IntPtrWndProc事件,但是当监听到改事件时,同过WMI来获取设备,有时候还不能获取到,因此还是使用WqlEventQuery来监听WMI的变化。下列是主要代码片段
1.获取硬盘的固件序列号,盘序列号(由系统指派的唯一ID),总容量,剩余容量,盘符,盘名称等信息
privatestaticList<DriverBase>GetDrivers(InterfaceTypetype,stringpartitionName) { List<DriverBase>drivers=newList<DriverBase>(); stringstrQuery="select*fromWin32_DiskDrive"; if(type==InterfaceType.USB) strQuery+="WhereInterfaceType='USB'"; elseif(type==InterfaceType.IDE) strQuery+="WhereInterfaceType='IDE'"; SelectQuerysq=newSelectQuery(strQuery); ManagementObjectSearchermos=newManagementObjectSearcher(sq); foreach(ManagementObjectdiskinmos.Get()) { stringDeviceID=disk["DeviceID"].ToString(); foreach(ManagementObjectpartitioninnewManagementObjectSearcher("ASSOCIATORSOF{Win32_DiskDrive.DeviceID='"+DeviceID+"'}WHEREAssocClass=Win32_DiskDriveToDiskPartition").Get()) { stringquery="ASSOCIATORSOF{Win32_DiskPartition.DeviceID='"+partition["DeviceID"]+"'}WHEREAssocClass=Win32_LogicalDiskToPartition"; foreach(ManagementObjectdisk1innewManagementObjectSearcher(query).Get()) { DriverBaseb=newDriverBase(); stringdiviceID=disk1["DeviceID"].ToString().Trim(); if(!IsNTFS(diviceID)) { continue; } stringName=disk1["Name"].ToString().Trim(); stringfreeSpace=disk1["FreeSpace"].ToString().Trim(); stringsize=disk1["Size"].ToString().Trim(); if(!string.IsNullOrEmpty(partitionName)&&Name.ToUpper()!=partitionName.ToUpper()) { continue; } b.DriverName=Helper.DriverHelper.GetVolumnLabel(diviceID); b.TotalSpace=double.Parse(size); b.FreeSpace=double.Parse(freeSpace); b.DeviceID=diviceID; b.IsOverload=(b.TotalSpace-b.FreeSpace)/b.TotalSpace>0.7; b.SerialNum=disk["SerialNumber"]==null?"":disk["SerialNumber"].ToString().Trim(); if(string.IsNullOrEmpty(b.SerialNum)) { stringpnpdeviceid=disk["PNPDeviceID"]==null?"":disk["PNPDeviceID"].ToString().Trim(); if(!string.IsNullOrEmpty(pnpdeviceid)) b.SerialNum=parseSerialFromDeviceID(pnpdeviceid); } b.VolumeSerialNum=GetVolumeSerialNumber(diviceID); if(!string.IsNullOrEmpty(b.SerialNum)) drivers.Add(b); } } } returndrivers; } ///<summary> ///Getdriverbypartitionname ///</summary> ///<paramname="name">nameshouldbe"C:"or"D"</param> ///<returns></returns> publicstaticDriverBaseGetDriverByName(stringname) { stringstrQuery="select*fromWin32_LogicalDiskwhereDeviceID='"+name+"'"; SelectQuerysq=newSelectQuery(strQuery); ManagementObjectSearchermos=newManagementObjectSearcher(sq); DriverBasedriver=null; foreach(ManagementObjectdiskinmos.Get()) { driver=newDriverBase(); driver.DeviceID=disk["DeviceID"].ToString(); driver.DriverName=disk["VolumeName"].ToString(); driver.VolumeSerialNum=disk["VolumeSerialNumber"].ToString(); driver.TotalSpace=double.Parse(disk["Size"].ToString()); if(disk["FileSystem"].ToString()!="NTFS") { returnnull; } driver.FreeSpace=double.Parse(disk["FreeSpace"].ToString()); driver.IsOverload=(driver.TotalSpace-driver.FreeSpace)/driver.TotalSpace>0.7; driver.SerialNum=GetSeiralByDevice(driver.DeviceID); if(!string.IsNullOrEmpty(driver.SerialNum)) returndriver; } returndriver; //returnDriverBase.GetDrivers(InterfaceType.ALL,name).FirstOrDefault(); } //fixcannotgetserialnumberofsomeflashdriverofWMI //http://stackoverflow.com/questions/1176053/read-usb-device-serial-number-in-c-sharp/1176089#1176089privatestaticstringparseSerialFromDeviceID(stringdeviceId) { string[]splitDeviceId=deviceId.Split('\\'); string[]serialArray; stringserial; intarrayLen=splitDeviceId.Length-1; serialArray=splitDeviceId[arrayLen].Split('&'); serial=serialArray[0]; returnserial; }
2.下列代码段用于监听新增或删除外接设备
publicclassUsbDriverWatcher { ManagementEventWatchereventWatcher; ManagementEventWatcherdelEventWatcher; publicvoidStart() { try { //DriveType //ValueMeaning //0Unknown //1NoRootDirectory //2RemovableDisk //3LocalDisk //4NetworkDrive //5CompactDisc //6RAMDisk WqlEventQueryquery=newWqlEventQuery("__InstanceCreationEvent",newTimeSpan(0,0,1),@"TargetInstanceISA'Win32_LogicalDisk'"); ConnectionOptionsopt=newConnectionOptions(); opt.EnablePrivileges=true; opt.Authority=null; opt.Authentication=AuthenticationLevel.Default; ManagementScopescope=newManagementScope("\\root\\CIMV2",opt); eventWatcher=newManagementEventWatcher(scope,query); eventWatcher.EventArrived+=newEventArrivedEventHandler(eventWatcher_EventArrived); eventWatcher.Start(); WqlEventQuerydelQuery=newWqlEventQuery("__InstanceDeletionEvent",newTimeSpan(0,0,1),@"TargetInstanceISA'Win32_LogicalDisk'"); ConnectionOptionsopt2=newConnectionOptions(); opt2.EnablePrivileges=true; opt2.Authority=null; opt2.Authentication=AuthenticationLevel.Default; ManagementScopescope2=newManagementScope("\\root\\CIMV2",opt2); delEventWatcher=newManagementEventWatcher(scope2,delQuery); delEventWatcher.EventArrived+=newEventArrivedEventHandler(delEventWatcher_EventArrived); delEventWatcher.Start(); } catch(Exceptionex) { } } publicvoidStop() { if(eventWatcher!=null) { eventWatcher.Stop(); delEventWatcher.Stop(); } } voideventWatcher_EventArrived(objectsender,EventArrivedEventArgse) { ManagementBaseObjectwmiDevice=(ManagementBaseObject)e.NewEvent["TargetInstance"]; StringdriveName=(string)wmiDevice["DeviceID"]; //stringvolumeName=wmiDevice.Properties["VolumeName"].Value==null?"":wmiDevice.Properties["VolumeName"].Value.ToString(); if(!string.IsNullOrEmpty(driveName)) { if(OnDeviceChanged!=null) { OnDeviceChanged(null,newDeviceChangedEventArgs() { DriverName=driveName, Action=DeviceChangedAction.Add }); } } } voiddelEventWatcher_EventArrived(objectsender,EventArrivedEventArgse) { ManagementBaseObjectwmiDevice=(ManagementBaseObject)e.NewEvent["TargetInstance"]; StringdriveName=(string)wmiDevice["DeviceID"]; stringvolumeName=wmiDevice.Properties["VolumeName"].Value==null?"":wmiDevice.Properties["VolumeName"].Value.ToString(); if(!string.IsNullOrEmpty(driveName)) { if(OnDeviceChanged!=null) { OnDeviceChanged(null,newDeviceChangedEventArgs() { DriverName=driveName, Action=DeviceChangedAction.Remove }); } } } publiceventDeviceChangedEventHandlerOnDeviceChanged; }
//使用方法
watcher=newUsbDriverWatcher();
watcher.OnDeviceChanged+=watcher_OnDeviceChanged;
watcher.Start();
3、使用WndProc方法来监听外接设备变化的方法:
IntPtrWndProc(IntPtrhwnd,intmsg,IntPtrwParam,IntPtrlParam,refboolhandled)
{
Handlemessages...
if(msg==WM_DEVICECHANGE)
{
App.Log.WriteInfo("DevicechangemessagereceivedinWndProc.");
if(!ViewModelLocator.Main._loading)
{
//needtostartanewthreadtoloaddriverlist
//http://stackoverflow.com/questions/3921661/disconnectedcontext-mda-when-calling-wmi-functions-in-single-threaded-applicatioSystem.Threading.Threadt=newSystem.Threading.Thread(ViewModelLocator.Main.LoadDrivers);
t.Start();
}
}
returnIntPtr.Zero;
}
相关文章推荐
- c# 获取移动硬盘信息、监听移动设备的弹出与插入事件
- 关于获取u盘,移动硬盘设备信息的问题
- C#使用Xamarin开发可移植移动应用终章(11.获取设备信息与常用组件,开源一个可开发模版.)
- c#获取硬盘,CUP等信息
- java翻译到mono C#实现系列(3) 获取手机设备信息(残缺,)
- C# 获取指定目录下所有文件信息、移动目录、拷贝目录
- 转:C# 获取指定目录下所有文件信息、移动目录、拷贝目录
- c#获取逻辑硬盘信息
- 通过Windows注册表获取U盘、移动硬盘和USB读卡器等设备的PID、VID和序列号
- C# 移动设备插入检测
- C#.net 获取CPU 硬盘 网卡 信息 代码
- C# 获取指定目录下所有文件信息、删除文件、目录,移动目录,拷贝目录
- C# 获取机器的硬件信息(CPU ID序列号, 主板信息,硬盘序列号,系统信息)
- [No0000112]ComputerInfo,C#获取计算机信息(cpu使用率,内存占用率,硬盘,网络信息)
- C# 获取指定目录下所有文件信息、移动目录、拷贝目录
- C#通过 WURFL 获取设备信息
- c# WMI获取机器硬件信息(硬盘,cpu,内存等)
- C# 获取指定目录下所有文件信息、移动目录、拷贝目录
- js监听滚动条事件和获取浏览器及屏幕高度和宽度等信息的方法
- C#获取电脑硬件信息(CPU ID、主板ID、硬盘ID、BIOS编号)说明