2018-8-10-WPF-判断USB插拔
title | author | date | CreateTime | categories |
---|---|---|---|---|
WPF 判断USB插拔
|
lindexi
|
2018-08-10 19:16:53 +0800
|
2018-8-5 13:0:31 +0800
|
WPF
|
本文告诉大家如何在 WPF 在用户插拔 USB 收到消息
首先需要在一个窗口重写OnSourceInitialized
,在这里可以拿到窗口的指针
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e); var hwndSource = PresentationSource.FromVisual(this) as HwndSource;
hwndSource?.AddHook(new HwndSourceHook(WndProc));
}
在 USB 插拔可以收到 DEVICECHANGE 消息
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam, ref bool handled)
{
if (msg == (int) WM.DEVICECHANGE)
{
Debug.WriteLine(DateTime.Now.ToString() + " " + "设备发生插拔\r\n");
}
return IntPtr.Zero;
}
这里的 WM.DEVICECHANGE 就是 537 ,关于其他的消息请看win 消息
如果需要获得更多的 USB 信息就建议安装 WpfUsbMonitor 通过这个可以简单知道 USB 是否插入
使用这个的方法很简单,请看下面代码
public MainWindow()
{
InitializeComponent(); var usbMonitor = new UsbMonitor(this);
usbMonitor.UsbUpdate += UsbMonitor_UsbUpdate;
} private void UsbMonitor_UsbUpdate(object sender, UsbEventArgs e)
{
Debug.WriteLine($@"
USB { e.Action.ToString()}
USB 名 {e.Name}
USB 类别{e.Class}
USB GUID{e.ClassGuid}");
}
如果不想安装库,只是需要知道是插入还是拔出,可以使用 WMI 的方法,需要安装 System.Management 更多关于这方面请看 WPF 读取硬件序列号
public MainWindow()
{
InitializeComponent(); ManagementEventWatcher watcher = new ManagementEventWatcher();
WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_VolumeChangeEvent WHERE EventType = 2 or EventType = 3"); watcher.EventArrived += (s, e) =>
{
string driveName = e.NewEvent.Properties["DriveName"].Value.ToString();
EventType eventType = (EventType) (Convert.ToInt16(e.NewEvent.Properties["EventType"].Value)); string eventName = Enum.GetName(typeof(EventType), eventType); Console.WriteLine("{0}: {1} {2}", DateTime.Now, driveName, eventName);
}; watcher.Query = query;
watcher.Start();
} public enum EventType
{
Inserted = 2,
Removed = 3
}
如果需要知道是哪个设备进行插拔,可以使用下面方法
public MainWindow()
{
InitializeComponent(); WqlEventQuery insertQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'"); ManagementEventWatcher insertWatcher = new ManagementEventWatcher(insertQuery);
insertWatcher.EventArrived += (s, e) =>
{
Console.WriteLine("插入设备"); var instance = (ManagementBaseObject) e.NewEvent["TargetInstance"];
var description = instance.Properties["Description"]; Console.WriteLine(description.Name + " = " + description.Value); var deviceId = instance.Properties["DeviceID"];
Console.WriteLine(deviceId.Name + " = " + deviceId.Value); };
insertWatcher.Start(); WqlEventQuery removeQuery = new WqlEventQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_USBHub'");
ManagementEventWatcher removeWatcher = new ManagementEventWatcher(removeQuery);
removeWatcher.EventArrived += (s, e) =>
{
Console.WriteLine("移除设备"); var instance = (ManagementBaseObject) e.NewEvent["TargetInstance"];
var description = instance.Properties["Description"]; Console.WriteLine(description.Name + " = " + description.Value); var deviceId = instance.Properties["DeviceID"];
Console.WriteLine(deviceId.Name + " = " + deviceId.Value);
};
removeWatcher.Start();
}
2018-8-10-WPF-判断USB插拔的更多相关文章
- QTC++监控USB插拔
#if defined(Q_OS_WIN) #include <qt_windows.h> #include <QtCore/qglobal.h> #include <d ...
- USB插拔检测程序
一.手动添加ON_WM_DEVICECHANGE()消息 二.添加头文件#include <Dbt.h> 三.定义设备的GUID static const GUID GUID_DEVINT ...
- C# 上位机的USB设备拔插检测
我们做USB通信时,通信成功后,往往要检测USB设备的拔插状态,这里就USB拔插进行一下说明. 参考:https://www.imooc.com/article/17438 先说明一下,我这里只是用C ...
- C#.NET U盘插拔监控
[1]涉及的知识点 1) windows消息处理函数 ? 1 protected override void WndProc(ref Message m) 捕获Message的系统硬件改变发出的系统消 ...
- USB线插拔检测使用UEventObserver检测uevent事件的分析
说实话这玩样儿的代码量真的很少,大家如果能耐得住性子啃一会儿也就能撸懂了. 在这之前研究USB线插拔的时候就知道了有这么个东西,当时也就看了看,但没做什么笔记.最近想用起来,却发现就只有个名字在记忆中 ...
- 通过解读 WPF 触摸源码,分析 WPF 插拔设备触摸失效的问题(问题篇)
在 .NET Framework 4.7 以前,WPF 程序的触摸处理是基于操作系统组件但又自成一套的,这其实也为其各种各样的触摸失效问题埋下了伏笔.再加上它出现得比较早,触摸失效问题也变得更加难以解 ...
- WPF 插拔触摸设备触摸失效
原文:WPF 插拔触摸设备触摸失效 最近使用 WPF 程序,在不停插拔触摸设备会让 WPF 程序触摸失效.通过分析 WPF 源代码可以找到 WPF 触摸失效的原因. 在 Windows 会将所有的 H ...
- Delphi在Android下实现BroadcastReceiver功能(举例在Delphi下获取USB外设拔插消息)
在Android里,用java通过实现BroadcastReceiver接口,就可以获得Intent消息.可是Delphi程序不能直接实现JBroadcastReceiver,如何能够实现类似Java ...
- ARM上的linux如何实现无线网卡的冷插拔和热插拔
ARM上的linux如何实现无线网卡的冷插拔和热插拔 fulinux 凌云实验室 1. 冷插拔 如果在系统上电之前就将RT2070/RT3070芯片的无线网卡(以下简称wlan)插上,即冷插拔.我们通 ...
随机推荐
- 让docker容器使用主机系统时间(挂入/etc/localtime)
-v挂入这个文件就可以了: -v /etc/localtime:/etc/localtime:ro
- 一、Spring Boot系列:通过Maven创建第一个项目
1.打开idea选择创建工程 2.创建maven工程,同时选择jdk1.8 注意:不需要勾选其他选项 3.填写项目名称 4.创建好maven项目后,在pom.xml文件中导入Spring Boot需要 ...
- windows java jdk安装
安装 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 勾选协议,选择 ...
- 带有IBM大脑的浮动机器人被成功引导至太空
近日,带有IBM大脑的浮动机器人被成功引导至太空,在接下来的装运前往国际空间站包近三吨的研究和再补给材料. 机器人的全名是CrewInteractiveMobileCompanion:Cimon.它看 ...
- vs code 使用技巧整理
快捷键 Ctrl + Shift + F:在文件夹中搜索; Ctrl + Shift + P:命令面板; Ctrl + Shift + T:重新打开 关闭的编辑页面; Ctrl+Shift+PgUp/ ...
- oracle集合的应用
union:求并集,公共部分只包含一个 ABC 和AB都没有显示出来 2:union all 相同的数据会包含两个 3:交集 intersect 既包含A又包含B 4:求差集 A集合中的数据B集合中 ...
- 4412 使用小度wifi
本文转载至:https://blog.csdn.net/robertsong2004/article/details/42985223 作者:刘老师,华清远见嵌入式学院讲师. FS_4412可以同链接 ...
- [CSP-S模拟测试]:y(DP+bitset)
题目背景 $\frac{1}{4}$遇到了一道水题,叕完全不会做,于是去请教小$D$.小$D$懒得理$\frac{1}{4}$,直接就离开了.于是,$\frac{1}{4}$只好来问你,这道题是这样的 ...
- (转)阿里官方提供的dubbo-spring-boot-starter 1.0.1 整合的dubbo 2.6.0和spring boot 1.5.9 案例
作者:许浩_5e9f链接:https://www.jianshu.com/p/5381cc8876e3來源:简书著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. springboo ...
- Oracle 11g 概述
始于:1970.6月份的一篇论文,IBM研究员埃德加‘考特<大型共享数据库的关系模型>(也是转折点)1977.6月Larry Ellison Bob Miner Ed Oates创办了“软 ...