原文 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. UNIX环境高级编程--#include "apue.h"

    apue.h头文件为作者自己编写而非系统自带,故需要自行添加! 第一:打开网站 http://www.apuebook.com/第二:选择合适的版本(一共有三个版本,根据书的版本选择)下载源码sour ...

  2. SQL语句执行效率及分析

    查询效率分析:子查询为确保消除重复值,必须为外部查询的每个结果都处理嵌套查询.在这种情况下可以考虑用联接查询来取代.如果要用子查询,那就用EXISTS替代IN.用NOT EXISTS替代NOT IN. ...

  3. shell script 零碎知识

    1.test命令的测试功能 -e  文件名是否存在 -f  文件名是否存在且为文件 -d  文件名是否存在且为目录 范例1    检查/dmtsai是否存在,存在输出 exist  不存在输出 Not ...

  4. [转]Hibernate中property-ref的应用,常用来解决遗留数据库One To Many关系

    [转]Hibernate中property-ref的使用,常用来解决遗留数据库One To Many关系 1.如表Class(ClassID,Class_No,ClassName)与Student(S ...

  5. poj 2686 Traveling by Stagecoach ---状态压缩DP

    题意:给出一个简单带权无向图和起止点,以及若干张马车车票,每张车票可以雇到相应数量的马. 点 u, v 间有边时,从 u 到 v 或从 v 到 u 必须用且仅用一张车票,花费的时间为 w(u, v) ...

  6. 跟我一起学extjs5(24--模块Form的自己定义的设计[2])

    跟我一起学extjs5(24--模块Form的自己定义的设计[2])         在本节中将要增加各种类型的字段,在增加字段的时候因为能够一行增加多个字段,因此层次结构又多了一层fieldcont ...

  7. varnish和squid的对比

    Varnish与Squid的对比  说到Varnish,不能不提Squid,Squid是一个高性能的代理缓存服务器,它和varnish之间有诸多的异同点,这里分析如下:  下面是他们之间的相同点:   ...

  8. SQL事务与并发

    1.Transaction(事务)是什么: 事务是作为单一工作单元而执行的一系列操作.包括增删查改. 2.事务的种类: 事务分为显示事务和隐式事务: 隐式事务:就是平常我们使用每一条sql 语句就是一 ...

  9. css3设置box-pack和box-align让div里面的元素垂直居中

    只要设置元素的box-pack和box-align即可,这两个属性当前只有webkit和moz支持,要设置垂直居中的话只需要将这两个属性的值都设置为center即可,需要的朋友可以参考下   以前处理 ...

  10. C趣味100道之58.拉丁方的一些想法。

    题目如上. 思路(未写) 完整代码如下: #include<iostream> #include<queue> #include<math.h> using nam ...