QT:检测U盘插入和拔出(windows)

1、先检测驱动器;

2、可以使用GetDriveType函数来获取驱动器的类型,以下是函数的链接;

https://docs.microsoft.com/zh-cn/windows/win32/api/fileapi/nf-fileapi-getdrivetypea?redirectedfrom=MSDN 

3、通过数量变化来判断插入或者移除。

关键代码

/*******************************************************
* @brief        -
* @author       xiaolei
* @copyright    -
* @version      V1.0
* @data         2019-11-19
* @note         1、检测盘符
* @note         2、判断是否插入/移除移动驱动器
* @note         3、没有获取设备ID,因此不知道删除的是哪个设备?
* @note         -
*******************************************************/
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <windows.h>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QFileInfoList list =  QDir::drives();  //获取当前系统的盘符
    qDebug()<<"驱动器数量: "<<list.count();
    driver_number=list.count();

    for(int i=0;i<list.count();++i)
    {
        UINT driver_type = GetDriveType((WCHAR *) list[i].filePath().utf16());

        switch (driver_type) {
        case 0:
            qDebug()<<list[i].filePath()<<" "<<driver_type<<" 驱动类型不能确定";
            break;
        case 1:
            qDebug()<<list[i].filePath()<<" "<<driver_type<<" 根路径无效";
            break;
        case 2:
            qDebug()<<list[i].filePath()<<" "<<driver_type<<" 可移动驱动器:软盘驱动器,拇指驱动器或闪存卡读取器";
            removable_number++;
            break;
        case 3:
            qDebug()<<list[i].filePath()<<" "<<driver_type<<" 固定驱动器:硬盘驱动器或闪存驱动器";
            break;
        case 4:
            qDebug()<<list[i].filePath()<<" "<<driver_type<<" 远程(网络)驱动器";
            break;
        case 5:
            qDebug()<<list[i].filePath()<<" "<<driver_type<<" CD-ROM驱动器";
            break;
        case 6:
            qDebug()<<list[i].filePath()<<" "<<driver_type<<" RAM磁盘";
            break;
        default:
            break;
        }
    }

    timer=new QTimer(this);
    timer->start(3000);
    connect(timer,&QTimer::timeout,this,&MainWindow::detectDriver);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::detectDriver()
{
    QFileInfoList list =  QDir::drives();  //获取当前系统的盘符

    int temp_number=0;

    std::vector<UINT> driver_types;
    for(int i=0;i<list.count();++i)
    {
        UINT driver_type = GetDriveType((WCHAR *) list[i].filePath().utf16());
        driver_types.push_back(driver_type);
        switch (driver_type) {
        case 0:
            //qDebug()<<list[i].filePath()<<" "<<driver_type<<" 驱动类型不能确定";
            break;
        case 1:
            //qDebug()<<list[i].filePath()<<" "<<driver_type<<" 根路径无效";
            break;
        case 2:
            temp_number++;
            //qDebug()<<list[i].filePath()<<" "<<driver_type<<" 可移动驱动器:软盘驱动器,拇指驱动器或闪存卡读取器";
            break;
        case 3:
            //qDebug()<<list[i].filePath()<<" "<<driver_type<<" 固定驱动器:硬盘驱动器或闪存驱动器";
            break;
        case 4:
            //qDebug()<<list[i].filePath()<<" "<<driver_type<<" 远程(网络)驱动器";
            break;
        case 5:
            //qDebug()<<list[i].filePath()<<" "<<driver_type<<" CD-ROM驱动器";
            break;
        case 6:
            //qDebug()<<list[i].filePath()<<" "<<driver_type<<" RAM磁盘";
            break;
        default:
            break;
        }
    }
    if(temp_number>removable_number)
    {
        qDebug()<<"驱动器数量: "<<list.count();
        qDebug()<<"插入可移动驱动器!!!";
    }
    else if(temp_number==removable_number)
    {
        //qDebug()<<"未插入/移除可移动驱动器!!!";
    }
    else if(temp_number<removable_number)
    {
        qDebug()<<"驱动器数量: "<<list.count();
        qDebug()<<"移除可移动驱动器!!!";
    }
    removable_number=temp_number;
    driver_number=list.count();
}

 

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用DBus来检测U盘的热插拔。DBus是Linux中一种常用的进程间通信机制,可以用于应用程序之间或者应用程序和系统之间的通信。 具体实现步骤如下: 1. 安装DBus库和开发包 ``` sudo apt-get install libdbus-1-dev libdbus-glib-1-dev ``` 2. 编写DBus服务 DBus服务是一个后台进程,用于监听系统事件。在这里,我们需要监听U盘的热插拔事件。 ```c++ #include <dbus/dbus-glib.h> #include <glib.h> #include <stdio.h> static void signal_handler(DBusGProxy *proxy, const char *sender_name, const char *object_path, const char *interface_name, const char *signal_name, GArray *args, gpointer user_data) { // 打印信号名和携带的参数 printf("Signal: %s, Args: %d\n", signal_name, args->len); } int main(int argc, char **argv) { DBusGConnection *connection; GError *error = NULL; // 初始化DBus连接 g_type_init(); connection = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error); if (connection == NULL) { g_printerr("Failed to open connection to bus: %s\n", error->message); g_error_free(error); return 1; } // 注册监听U盘热插拔事件的DBus服务 DBusGProxy *proxy = dbus_g_proxy_new_for_name(connection, "org.freedesktop.Hal", "/org/freedesktop/Hal/Manager", "org.freedesktop.Hal.Manager"); if (proxy == NULL) { g_printerr("Failed to create proxy for org.freedesktop.Hal.Manager\n"); return 1; } dbus_g_proxy_add_signal(proxy, "DeviceAdded", G_TYPE_STRING, G_TYPE_INVALID); dbus_g_proxy_add_signal(proxy, "DeviceRemoved", G_TYPE_STRING, G_TYPE_INVALID); dbus_g_proxy_connect_signal(proxy, "DeviceAdded", G_CALLBACK(signal_handler), NULL, NULL); dbus_g_proxy_connect_signal(proxy, "DeviceRemoved", G_CALLBACK(signal_handler), NULL, NULL); // 运行DBus主循环 GMainLoop *loop = g_main_loop_new(NULL, FALSE); g_main_loop_run(loop); // 清理DBus连接 g_object_unref(proxy); dbus_g_connection_unref(connection); return 0; } ``` 3. 编译并运行DBus服务 ``` gcc -o dbus-service dbus-service.c `pkg-config --libs --cflags dbus-glib-1` ./dbus-service ``` 4. 测试DBus服务 插入拔出U盘后,DBus服务会打印出相应的热插拔事件。 注意:DBus服务需要以root权限运行才能监听系统事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值