原文 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. iOS Dev (22) 文件、路径

    iOS Dev (22) 文件.路径 作者:CSDN 大锐哥 博客:http://blog.csdn.net/prevention 沙箱 Sandbox 的路径 和其他很多应用平台一样,iOS 也限定 ...

  2. accordion

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 项目与软件推荐之编辑器-QOwnNotes(刺激自己)

    项目与软件推荐之编辑器-QOwnNotes 今天推荐一款软件 QOwnNotes,是一款普通文本笔记软件.以某个路径为目录,罗列出目录下所有的 md 文件或者 txt 文件. 有如下亮点: 启动速度快 ...

  4. Delphi2007下CIS的clHttp使用

    Delphi组件Clever Suite Internet是一款优秀的网络组件,唯一让我感觉不足的是ClHttp竟然使用了断言,当程序遇到问题的时候就会弹出一个对话框,并显示问题是出在了那个单元里.好 ...

  5. FirewallD 详解

    在CentOS7开始,默认是没有iptables的,而是使用了firewall防火墙.与时俱进,简单的整理了一下firewall的使用方法.关于详细的介绍参考官网,就不搬字了.这个网站有中文选项.可以 ...

  6. C语言入门(20)——使用VC2013对C语言进行调试

    软件调试过程中,有时会一些逻辑和内存访问方面的问题,如果没有调试器的帮助,找出何处代码导致这块内存被更改是一件非常麻烦的事情.恰当运用数据断点可以快速帮我们定位问题的所在. 1.VC的调试快捷键 F5 ...

  7. 普林斯顿大学算法课 Algorithm Part I Week 3 排序稳定性 Stability

    稳定性(Stability):先按性质A排序,再按性质B排序,性质B相同的那些项是否仍然是按性质A排序的? 一个稳定的排序,相同值的元素应仍保持相对顺序(relative order) 稳定的算法:插 ...

  8. Jquery操作-(多种实例)--未完

    一.Jquery简介 定义 jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库. jQuery对象 jQuer ...

  9. php技能考试每日一练

    PHP技術者認定 1, [日本語文字のメール送信] (2016年10月31日)以下のコードは桃家タローさん宛てにメールを送るためのものである.コード内の[(1)]に入る正しいものを1つ次の記述の中から ...

  10. I NEED A OFFER!

    I NEED A OFFER! Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Tot ...