您的位置:首页 > 编程语言 > C#

c# 获取移动硬盘信息、监听移动设备的弹出与插入事件

2013-09-27 19:06 621 查看
原文/article/6007539.html

备忘一下改功能,主要通过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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: