原文 http://www.cnblogs.com/coolkiss/p/3328825.html

备忘一下改功能,主要通过WMI来实现,对于监听外接设备的弹出和插入事件一开始使用IntPtr WndProc事件,但是当监听到改事件时,同过WMI来获取设备,有时候还不能获取到,因此还是使用WqlEventQuery 来监听WMI的变化。下列是主要代码片段

1. 获取硬盘的固件序列号,盘序列号(由系统指派的唯一ID),总容量,剩余容量, 盘符,盘名称等信息

private static List<DriverBase> GetDrivers(InterfaceType type, string partitionName)
{
List<DriverBase> drivers = new List<DriverBase>();
string strQuery = "select * from Win32_DiskDrive";
if(type == InterfaceType.USB)
strQuery += " Where InterfaceType = 'USB'";
else if (type == InterfaceType.IDE)
strQuery += " Where InterfaceType = 'IDE'"; SelectQuery sq = new SelectQuery(strQuery);
ManagementObjectSearcher mos = new ManagementObjectSearcher(sq);
foreach (ManagementObject disk in mos.Get())
{
string DeviceID = disk["DeviceID"].ToString();
foreach (ManagementObject partition in new ManagementObjectSearcher("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + DeviceID + "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition").Get())
{
string query = "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" + partition["DeviceID"] + "'} WHERE AssocClass = Win32_LogicalDiskToPartition";
foreach (ManagementObject disk1 in new ManagementObjectSearcher(query).Get())
{
DriverBase b = new DriverBase();
string diviceID = disk1["DeviceID"].ToString().Trim();
if (!IsNTFS(diviceID))
{
continue;
}
string Name = disk1["Name"].ToString().Trim();
string freeSpace = disk1["FreeSpace"].ToString().Trim();
string size = 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))
{
string pnpdeviceid = 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); }
}
}
return drivers;
} /// <summary>
/// Get driver by partition name
/// </summary>
/// <param name="name">name should be "C:" or "D"</param>
/// <returns></returns>
public static DriverBase GetDriverByName(string name)
{
string strQuery = "select * from Win32_LogicalDisk where DeviceID='" + name + "'"; SelectQuery sq = new SelectQuery(strQuery);
ManagementObjectSearcher mos = new ManagementObjectSearcher(sq);
DriverBase driver = null;
foreach (ManagementObject disk in mos.Get())
{
driver = new DriverBase();
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")
{
return null;
}
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))
return driver;
}
return driver;
//return DriverBase.GetDrivers(InterfaceType.ALL, name).FirstOrDefault();
} // fix cannot get serial number of some flash driver of WMI
// http://stackoverflow.com/questions/1176053/read-usb-device-serial-number-in-c-sharp/1176089#1176089
private static string parseSerialFromDeviceID(string deviceId)
{
string[] splitDeviceId = deviceId.Split('\\');
string[] serialArray;
string serial;
int arrayLen = splitDeviceId.Length - ; serialArray = splitDeviceId[arrayLen].Split('&');
serial = serialArray[]; return serial;
}

2. 下列代码段用于监听新增或删除外接设备

  public class UsbDriverWatcher
{
ManagementEventWatcher eventWatcher;
ManagementEventWatcher delEventWatcher;
public void Start()
{
try
{
//DriveType
//Value Meaning
//0 Unknown
//1 No Root Directory
//2 Removable Disk
//3 Local Disk
//4 Network Drive
//5 Compact Disc
//6 RAM Disk
WqlEventQuery query = new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(, , ), @"TargetInstance ISA 'Win32_LogicalDisk'"); ConnectionOptions opt = new ConnectionOptions();
opt.EnablePrivileges = true;
opt.Authority = null;
opt.Authentication = AuthenticationLevel.Default; ManagementScope scope = new ManagementScope("\\root\\CIMV2", opt); eventWatcher = new ManagementEventWatcher(scope, query);
eventWatcher.EventArrived += new EventArrivedEventHandler(eventWatcher_EventArrived);
eventWatcher.Start(); WqlEventQuery delQuery = new WqlEventQuery("__InstanceDeletionEvent", new TimeSpan(, , ), @"TargetInstance ISA 'Win32_LogicalDisk'"); ConnectionOptions opt2 = new ConnectionOptions();
opt2.EnablePrivileges = true;
opt2.Authority = null;
opt2.Authentication = AuthenticationLevel.Default; ManagementScope scope2 = new ManagementScope("\\root\\CIMV2", opt2); delEventWatcher = new ManagementEventWatcher(scope2, delQuery);
delEventWatcher.EventArrived += new EventArrivedEventHandler(delEventWatcher_EventArrived);
delEventWatcher.Start();
}
catch (Exception ex)
{
}
} public void Stop()
{
if (eventWatcher != null)
{
eventWatcher.Stop();
delEventWatcher.Stop();
}
} void eventWatcher_EventArrived(object sender, EventArrivedEventArgs e)
{
ManagementBaseObject wmiDevice = (ManagementBaseObject)e.NewEvent["TargetInstance"];
String driveName = (string)wmiDevice["DeviceID"];
//string volumeName = wmiDevice.Properties["VolumeName"].Value == null ? "":wmiDevice.Properties["VolumeName"].Value.ToString();
if (!string.IsNullOrEmpty(driveName))
{
if (OnDeviceChanged != null)
{
OnDeviceChanged(null, new DeviceChangedEventArgs()
{
DriverName = driveName,
Action = DeviceChangedAction.Add
});
}
}
} void delEventWatcher_EventArrived(object sender, EventArrivedEventArgs e)
{
ManagementBaseObject wmiDevice = (ManagementBaseObject)e.NewEvent["TargetInstance"];
String driveName = (string)wmiDevice["DeviceID"];
string volumeName = wmiDevice.Properties["VolumeName"].Value == null? "" : wmiDevice.Properties["VolumeName"].Value.ToString();
if (!string.IsNullOrEmpty(driveName))
{
if (OnDeviceChanged != null)
{
OnDeviceChanged(null, new DeviceChangedEventArgs()
{
DriverName = driveName,
Action = DeviceChangedAction.Remove
});
}
}
} public event DeviceChangedEventHandler OnDeviceChanged;
}

//使用方法
watcher = new UsbDriverWatcher();
watcher.OnDeviceChanged += watcher_OnDeviceChanged;
watcher.Start();

 

3、 使用WndProc方法来监听外接设备变化的方法:

        IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
Handle messages...
if (msg == WM_DEVICECHANGE)
{ App.Log.WriteInfo("Device change message received in WndProc.");
if (!ViewModelLocator.Main._loading)
{
// need to start a new thread to load driver list
// http://stackoverflow.com/questions/3921661/disconnectedcontext-mda-when-calling-wmi-functions-in-single-threaded-applicatio
System.Threading.Thread t = new System.Threading.Thread(ViewModelLocator.Main.LoadDrivers);
t.Start();
}
} return IntPtr.Zero;
}

c# 获取移动硬盘信息、监听移动设备的弹出与插入事件的更多相关文章

  1. js 监听手机端键盘弹出和收起事件

    //这里区分不同系统,可以参考之前的文档记录 https://www.cnblogs.com/wind-wang/p/10737110.html const ua = typeof window == ...

  2. vue 监听手机键盘是否弹出及input是否聚焦成功

    //定义移动端类型 function pageStats() { let u = navigator.userAgent, app = navigator.appVersion; let obj = ...

  3. Android 另类方法监听软键盘的弹出收起事件

    http://www.cnblogs.com/csonezp/p/5065624.html 最近做的项目碰到个问题,a界面是fragment+recyclerview,b界面带个edittext,并且 ...

  4. Android监听自身卸载,弹出用户反馈调查

    1,情景分析 在上上篇博客中我写了一下NDK开发实践项目,使用开源的LAME库转码MP3,作为前面几篇基础博客的加深理解使用的,但是这样的项目用处不大,除了练练NDK功底.这篇博客,我将讲述一下一个各 ...

  5. Android 应用监听自身卸载,弹出用户反馈调查

    监听卸载情景和原理分析 1,情景分析 在上上篇博客中我写了一下NDK开发实践项目,使用开源的LAME库转码MP3,作为前面几篇基础博客的加深理解使用的,但是这样的项目用处不大,除了练练NDK功底.这篇 ...

  6. Android 如何监听返回键,弹出一个退出对话框

    android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用程序不小心点击退出键而直接退出.自己记录下这个简单的demo,备用. public class BackKeyTest ...

  7. [转]Android 如何监听返回键,弹出一个退出对话框

    本文转自:http://blog.csdn.net/sunnyfans/article/details/8094349 Android 如何监听返回键点击事件,并创建一个退出对话框, 防止自己写的应用 ...

  8. e807. 设置进程监听对话框的延迟弹出

    By default, the progress monitor delays for a short period before it is displayed. There are two pro ...

  9. 获取运行端口监听的用户身份auth-owner

    获取运行端口监听的用户身份auth-owner   Windows系统提供工作在TCP 113端口的授权服务(Authentication Service),用来判断TCP连接的用户.Nmap的aut ...

随机推荐

  1. 项目中关于AJAX的使用总结

    一.使用情况:AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下使用.AJAX的核心:向服务器发送多个请求而无需用户等待来至服务器的响应. 二.AJAX的优势     1. ...

  2. php 垃圾回收机制----写时复制和引用计数

    PHP使用引用计数和写时复制来管理内存.写时复制保证了变量间复制值不浪费内存,引用计数保证了当变量不再需要时,将内存释放给操作系统. 要理解PHP内存管理,首先要理解一个概念----符号表. 符号表的 ...

  3. 传智播客C/C++学员荣膺微软&Cocos 2d-x黑客松最佳创新奖

     6月30日,历时32小时的微软开放技术Cocos 2d-x 编程黑客松在北京望京微软大厦成功落下帷幕,这是微软开放技术首次联合Cocos 2d-x 在中国举办黑客松.此次活动共有包括传智播客C/ ...

  4. IIS7性能优化:启用浏览器本地缓存

    原文地址:http://jingyan.baidu.com/article/597035521b96e88fc00740af.html

  5. Hibernate、批量操作数据

    Hibernate 批量操作数据可以使用两种方法实现 1.分批更新,每一小批同步一次数据: public void saveEmployee2(){ Session s=HibernateSessio ...

  6. mvc mvp mvvm区别

    1 mvc是有视图(view),控制器(controller),模型(model)组成 view(用户界面) controller (业务逻辑)            model(数据存储) 接受指令 ...

  7. mysql同时update多行

    当我们只更新一个字段时的语法如下: UPDATE mytable     SET myfield = CASE other_field         WHEN 1 THEN 'value'     ...

  8. java——推断日期是否在今天之前

    这里说的日期是指字符串的日期格式,如"2014-10-15",我们要推断这个日期是否在今天之前,网上看到好多推断的方法,都是拿这个日期转换成Date对象 然后与new Date() ...

  9. 依赖注入及AOP简述(十三)——AOP应用举例(完结) .

    2.     AOP应用举例 在一般的应用程序开发中,有一些典型的AOP应用,使得开发者可以专注于业务逻辑本身,而不是与之完全无关的一些“方面”. l        首先就是关于前面介绍过的日志输出类 ...

  10. Java学习笔记-File类的基本方法

    要渐渐养成写博客的习惯-----> 前段时间看Mars的java中的I/O流没怎么懂,发现I/O流好难啊.今天重新看一遍其他教学,还有书籍,做些笔记,记录下每天的学习生活. File类的一些方法 ...