#if defined(Q_OS_WIN)
#include <qt_windows.h>
#include <QtCore/qglobal.h>
#include <dbt.h>
#endif QByteArray *MainWindow::receivedData=new QByteArray();//接收到数据
ThreadComPort *MainWindow::threadInitComPort=0;
#if defined(Q_OS_WIN)
static const GUID GUID_DEVINTERFACE_USBSTOR = { 0xA5DCBF10L, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };
static const GUID InterfaceClassGuid = GUID_DEVINTERFACE_USBSTOR;
static bool isDoingSearch=false; static void SerachComPort(){
if(isDoingSearch==false){
isDoingSearch=true;
bool hasDevice=false;
QList<QSerialPortInfo> list= QSerialPortInfo::availablePorts();
for(int i=0;i<list.count();i++){
if(list[i].description().contains("USB CDC",Qt::CaseInsensitive)){
qDebug()<<"设备已经插入,端口:"<<list[i].portName();
Globals::PortName=list[i].portName();
hasDevice=true;
}
}
if(!hasDevice){
qDebug()<<"请插入设备";
Globals::PortName="NoDevice";
AddControl(new NoDevice());
Globals::parent->InitComPort();
}
isDoingSearch=false;
}
}
LRESULT CALLBACK dw_internal_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_DEVICECHANGE) {
switch (wParam) {
case DBT_DEVNODES_CHANGED:
qDebug()<<"设备插拔啦.";
Globals::parent->CloseComPort();
SerachComPort();
break;
}
}
// qDebug()<<"HWND:"<<hwnd;
return DefWindowProc(hwnd, message, wParam, lParam);
} static inline HWND WndProc(const void* userData)
{
QString className="UsbMonitor";
HINSTANCE hi = qWinAppInst(); WNDCLASS wc;
wc.style = 0;
wc.lpfnWndProc = dw_internal_proc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hi;
wc.hIcon = 0;
wc.hCursor = 0;
wc.hbrBackground = 0;
wc.lpszMenuName = NULL;
wc.lpszClassName = reinterpret_cast<const wchar_t *>(className.utf16());
RegisterClass(&wc); HWND hwnd = CreateWindow(wc.lpszClassName, // classname
wc.lpszClassName, // window name
0, // style
0, 0, 0, 0, // geometry
0, // parent
0, // menu handle
hi, // application
0); // windows creation data.
if (hwnd) {
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter ;
ZeroMemory(&NotificationFilter, sizeof(NotificationFilter)) ;
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
NotificationFilter.dbcc_classguid = InterfaceClassGuid;
RegisterDeviceNotification(hwnd, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
}
return hwnd;
}
#endif

  

QTC++监控USB插拔的更多相关文章

  1. 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: ...

  2. USB插拔检测程序

    一.手动添加ON_WM_DEVICECHANGE()消息 二.添加头文件#include <Dbt.h> 三.定义设备的GUID static const GUID GUID_DEVINT ...

  3. C#.NET U盘插拔监控

    [1]涉及的知识点 1) windows消息处理函数 ? 1 protected override void WndProc(ref Message m) 捕获Message的系统硬件改变发出的系统消 ...

  4. C# 上位机的USB设备拔插检测

    我们做USB通信时,通信成功后,往往要检测USB设备的拔插状态,这里就USB拔插进行一下说明. 参考:https://www.imooc.com/article/17438 先说明一下,我这里只是用C ...

  5. Android中监控USB的插拔

    一.需求 在Android应该开发过程中,用到了USB通讯,需要应用监控USB设备的插入和拔出,从而刷新USB设备列表. 二.实现 在使用时,需要register和unregister. 通过UsbD ...

  6. USB线插拔检测使用UEventObserver检测uevent事件的分析

    说实话这玩样儿的代码量真的很少,大家如果能耐得住性子啃一会儿也就能撸懂了. 在这之前研究USB线插拔的时候就知道了有这么个东西,当时也就看了看,但没做什么笔记.最近想用起来,却发现就只有个名字在记忆中 ...

  7. Delphi在Android下实现BroadcastReceiver功能(举例在Delphi下获取USB外设拔插消息)

    在Android里,用java通过实现BroadcastReceiver接口,就可以获得Intent消息.可是Delphi程序不能直接实现JBroadcastReceiver,如何能够实现类似Java ...

  8. ARM上的linux如何实现无线网卡的冷插拔和热插拔

    ARM上的linux如何实现无线网卡的冷插拔和热插拔 fulinux 凌云实验室 1. 冷插拔 如果在系统上电之前就将RT2070/RT3070芯片的无线网卡(以下简称wlan)插上,即冷插拔.我们通 ...

  9. 增加 addDataScheme("file") 才能收到SD卡插拔事件的原因分析 -- 浅析android事件过滤策略

    http://blog.csdn.net/silenceburn/article/details/6083375 =========================================== ...

随机推荐

  1. mac 学习笔记

    1.关于launchctl http://zhengwei.name/2011/11/lanunchctl-notes/ 2.php-fpm 默认配置 php-fpm.conf :/etc/php-f ...

  2. [零基础学JAVA]Java SE面向对象部分.面向对象基础(04)

     2.代码块 1.内部类 3.链表 2.代码块: 1.) 普通代码块. 2.)静态代码块. 3.)构造代码块. 4.)同步代码块. class Test{//构造块    {        Syste ...

  3. JAVA Color类

    Color类用于定义颜色,java.awt.Color中提供了13个预定义的常量用来表示13中标准颜色,分别是: public static final Color white白色. public s ...

  4. 基于cookie和session的登录验证

    settings.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions ...

  5. Django中模型(五)

    Django中模型(五) 六.模型查询 1.概述 查询集,表示从数据库获取的对象集合. 过滤器就是一个函数,基于所给的参数限制查询集结果.查询集可以有多个过滤器. 从sql角度来说,查询集合等价于se ...

  6. webpack中热模块更新

    Hot Module Replacement,热模块更新,很多时候会简写成HMR. "scripts": { "start": "webpack-de ...

  7. ZooKeeper学习之路 (七)ZooKeeper设计特点及典型应用场景

    ZooKeeper 特点/设计目的 ZooKeeper 作为一个集群提供数据一致的协调服务,自然,最好的方式就是在整个集群中的 各服务节点进行数据的复制和同步. 数据复制的好处 1.容错:一个节点出错 ...

  8. 2019.2.27 Eclipse中的Tomcat设置Tomcat服务器手动重启

    1.打开Tomcat的设置界面 2.找到Modules界面 3.去掉,就改为手动了

  9. Android UI【android 仿微信、QQ聊天,带表情,可翻页,带翻页拖动缓冲】

    http://blog.csdn.net/lnb333666/article/details/8546497 如题,这是公司项目的一个功能模块,先上个效果图: 其次大致说说原理: 1,首先判断输入的字 ...

  10. Java I/O系列(一)InputStream与OutputStream源码分析及理解

    1. InputStream 定义 字节输入流,是一个抽象类,核心是通过read()方法,从数据源中读取一个个字节出来,另有skip,mark功能 核心源码理解 源码: public abstract ...