原文 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. 在windows平台下忘记了root的密码如何解决?

    1.打开MySQL配置文件 my.ini中,添加上skip-grant-tables,可以添加到文件的末尾或者是这添加到[mysqld]的下面. 2.然后重启MYSQL服务 windows环境中: n ...

  2. Linux 终端颜色高亮

    昨天在改一些东西时,不小心将root下的一些配置文件删掉了.导致启动终端后,字完全一个颜色,没有区分.在网上找到的都是 改整体颜色的.但实际上这时应该搜Linux终端高亮才能找到解决办法.在这里再列出 ...

  3. 关于PHPExcel

    在学PHPExcel的时候,在网上查了很多资料,花了很多时间,下面是我想要分享给大家的,我找到的并进行了一定修改的亲身实践成功的资料,希望大家对大家有所帮助. 首先,需要下载PhpExcel资料,下载 ...

  4. vim calendar插件配置

    近日学习markdown,试着记个日志,安装了vim的知名插件calendar:https://github.com/mattn/calendar-vim. 使用网上配置,发现回车之后日期是昨天的,于 ...

  5. [Django] Pinax 项目下APP的 安装与使用

    Pinax下有数十个APP,怎么将这些APP集成到已有的Django 工程(http://www.cnblogs.com/xiaoqu/p/3196081.html)文件中去呢?现在用django-u ...

  6. DELPHI 任务栏无EXE显示

    需要用到的一个函数: LONG SetWindowLong( HWND hWnd, int nIndex, LONG dwNewLong ); program Project; usesForms,  ...

  7. top k 算法

    对于一个非有序的数组A[p..r],求数组中第k小的元素. 如何考虑 排序(部分排序)就不用说了..o(nlgn),当然如果在实际情况中要一直取值,当然要排序后,一次搞定,以后都是O(1) 我们这里提 ...

  8. strlen、strcmp、strcat、strcpy、memcpy基础函数的实现

    最近实习+投简历+琐事弄得自己忙的不行不行的,终于今天可以开始记录一些东西了... 1.strlen函数的实现 int strlen(const char *str){ assert(str!=NUL ...

  9. 网易云课堂_程序设计入门-C语言_第三周:循环_2数字特征值

    2 数字特征值(5分) 题目内容: 对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值.对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推.这个整数在第n位上的数字记作 ...

  10. Proud Merchants(01背包)

    Proud Merchants Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) To ...