原文 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. MySQL如何使用索引 较为详细的分析和例子

    在数据库表中,使用索引可以大大提高查询速度. 假如我们创建了一个 testIndex 表: CREATE TABLE testIndex(i_testID INT NOT NULL,vc_Name V ...

  2. centos6.4下没有heartbeat包解决办法

    1.在centos6.4 中使用yum install heartbeat,并没有发现heartbeat软件包 [root@master ~]# yum install heartbeat heart ...

  3. 001OC的结构解析

    Xcode通过.m扩展名来表示文件使用的是OC代码,C编译器处理.c文件,c++编译器处理cpp文件.所有编译工作默认由LLVM处理,这个编译器能够理解C语言的全部3个变体. #import<F ...

  4. iOS把一个简单的图形变成一个圆

    push是定义的一个button push.layer.masksToBounds = YES; push.layer.cornerRadius = 100; push.layer.borderWid ...

  5. Windows 10开发基础——文件、文件夹和库(一)

    原文:Windows 10开发基础--文件.文件夹和库(一) 主要内容: 1.枚举查询文件和文件夹 2.文本文件读写的三种方法——创建写入和读取文件 3.获得文件的属性 枚举查询文件和文件夹 先了解一 ...

  6. [置顶] 实习总结3-job hunting(西安工作)

    开始整理关于西安top level的IT企业的工作从去年开始实习就慢慢展开了,到了北京之后一直关注的比较密切,因此前前后后也整理了很多.本来不打算那么急着写这一篇的,但是在因为在公司呆着,对于西安的一 ...

  7. MFC的规则DLL中资源使用的问题

    今天刚刚做了一个静态链接到MFC的规则dll,即“Use MFC in a static library“,该dll用来显示一个窗体.然后在一个mfc可执行程序A.exe中调用这个dll文件,可以正常 ...

  8. linux学习之(四)-用户、组的操作,给文件文件夹设置组,更改目录权限、文件权限

    命令帮助查看: man 命令(查看一个命令的详细帮助信息) 例:man useradd 或者用  -h   格式   命令 -h(查看一个命令的简要帮助) 例:useradd -h 用户: 在user ...

  9. UIImage 图片处理:截图,缩放,设定大小,存储

    图片的处理大概就分 截图(capture), 缩放(scale),设定大小(resize), 存储(save)这几样比较好处理, 另外还有滤镜,擦试等, 以后再说在这个Demo code裡, 我写了几 ...

  10. js生成随机数的方法实例总结 [收藏]

    js生成随机数的方法实例总结 js生成随机数主要用到了内置的Math对象的random()方法.用法如:Math.random().它返回的是一个 0 ~ 1 之间的随机数.有了这么一个方法,那生成任 ...