QT windows平台下获取U盘 QComboBox显示U盘盘符
来源:互联网 发布:检测手机硬件的软件 编辑:程序博客网 时间:2024/05/17 06:16
在windows平台下获取U盘信息,可以调用windows API函数比较方便。本来想用qt QDBusConnection 来写的,网上关于这方面的代码比较多,但按照提示的步骤来写的就是无法编译,我也不知道为什么。如果有知道的朋友,留言给我或者qq 1585519210联系
在windows平台下U盘检测采用windows事件来设计,废话少说,上代码!
在windows平台下U盘检测采用windows事件来设计,废话少说,上代码!
#ifndef GETUSBDISKWIDGET_H#define GETUSBDISKWIDGET_H#include <QWidget>#include <windows.h>#include <winbase.h>#include <winnls.h>#include <dbt.h>#include <QCoreApplication>#include <QDebug>#include <QString>#include <QVector>#include <QStringList>namespace Ui { class GetUsbDiskWidget;}typedef struct USB_DISK_INFO{ QString DirPath; float TotalMemory; float FreeMemory;}USB_DISK_INFO;class GetUsbDiskWidget : public QWidget{ Q_OBJECTpublic: explicit GetUsbDiskWidget(QWidget *parent = 0); ~GetUsbDiskWidget(); void Init(); void ScanHD(); void AddDisk(QString &DiskName); void DeleteDisk(QString &DiskName); bool SearchDisk(QString &DiskName,int &iter); void GetMemorySize(USB_DISK_INFO & disk); void AddComboBoxItem(QString &item); void DeleteComboBoxItem(QString &item); bool winEvent(MSG *message, long *result); char FirstDriveFromMask (ULONG unitmask); USB_DISK_INFO GetCheckedDisk();private: Ui::GetUsbDiskWidget *ui; QVector<USB_DISK_INFO> usb_disk_info; USB_DISK_INFO CurrentUseDisk;private slots: void on_comboBox_USB_currentIndexChanged(QString );};#endif // GETUSBDISKWIDGET_H
#include "getusbdiskwidget.h"#include "ui_getusbdiskwidget.h"#include <QTextCodec>GetUsbDiskWidget::GetUsbDiskWidget(QWidget *parent) : QWidget(parent), ui(new Ui::GetUsbDiskWidget){ QTextCodec::setCodecForCStrings(QTextCodec::codecForName("gb18030")); QTextCodec::setCodecForLocale(QTextCodec::codecForName("gb18030")); QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030")); ui->setupUi(this); this->Init();}GetUsbDiskWidget::~GetUsbDiskWidget(){ delete ui;}//=================================================================================//系统初始化//=================================================================================void GetUsbDiskWidget::Init(){ this->ScanHD(); ui->comboBox_USB->clear(); this->usb_disk_info.clear();}//=================================================================================//系统启动扫描已经连接的U盘 程序只会在系统执行时执行一次//=================================================================================void GetUsbDiskWidget::ScanHD(){ qDebug()<<"开机U盘扫描"; char diskPath[5] = { 0 }; DWORD allDisk = GetLogicalDrives(); //返回一个32位整数,将他转换成二进制后,表示磁盘,最低位为A盘 if (allDisk!=0) { for (int i=0;i<13;i++) //假定最多有12个磁盘从A开始计数 { if ((allDisk & 1)==1) { sprintf( diskPath, "%c", 'A'+i ); strcat( diskPath, ":" ); LPCWSTR RootPathName =(LPCWSTR)QString(diskPath).utf16(); if (GetDriveType(RootPathName) == DRIVE_REMOVABLE) { if( GetVolumeInformation(RootPathName,0,0,0,0,0,0,0) ) //判断驱动是否准备就绪 { qDebug()<<"U盘准备就绪!"<<diskPath; QString path(diskPath); this->AddDisk(path); } } } allDisk = allDisk>>1; } }}//=================================================================================//增加移动设备//=================================================================================void GetUsbDiskWidget::AddDisk(QString &DiskName){ int iter = 0; if(SearchDisk(DiskName,iter)) { return ; } USB_DISK_INFO usbtemp; usbtemp.DirPath = DiskName; GetMemorySize(usbtemp);//获取设备内存信息 this->usb_disk_info.push_back(usbtemp); this->AddComboBoxItem(DiskName);}//=================================================================================//删除移动设备//=================================================================================void GetUsbDiskWidget::DeleteDisk(QString &DiskName){ int iter = 0; if(SearchDisk(DiskName,iter)) { this->usb_disk_info.remove(iter); this->DeleteComboBoxItem(DiskName); }}//=================================================================================//搜索移动设备//=================================================================================bool GetUsbDiskWidget::SearchDisk(QString &DiskName, int &iter){ for(int i = 0;i < this->usb_disk_info.size();i++) { if(usb_disk_info.at(i).DirPath.compare(DiskName) == 0) { iter = i; return true; } } return false;}//=================================================================================//获取设备的内存信息//=================================================================================void GetUsbDiskWidget::GetMemorySize(USB_DISK_INFO &disk){ ULARGE_INTEGER liFreeBytesAvailable, liTotalBytes, liTotalFreeBytes; LPCWSTR lpcwstrDriver=(LPCWSTR)disk.DirPath.utf16(); if( !GetDiskFreeSpaceEx( lpcwstrDriver, &liFreeBytesAvailable, &liTotalBytes, &liTotalFreeBytes) ) { qDebug() << "ERROR: Call to GetDiskFreeSpaceEx() failed."; return ; } disk.FreeMemory = (float)liTotalFreeBytes.QuadPart/1024/1024/1024; //剩余内存 disk.TotalMemory = (float)liTotalBytes.QuadPart/1024/1024/1024; //总内存}//=================================================================================//过滤windows的U盘插入事件//=================================================================================bool GetUsbDiskWidget::winEvent(MSG *message, long *result){ QString DirPath; int msgType = message->message; if(msgType == WM_DEVICECHANGE) { qDebug()<< "winEvent in MgFrame : WM_DEVICECHANGE" ; PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)message->lParam; switch(message->wParam) { case DBT_DEVICEARRIVAL: if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME) { PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb; if (lpdbv -> dbcv_flags == 0) { //插入U盘,获取盘符 DirPath = QString(this->FirstDriveFromMask(lpdbv ->dbcv_unitmask)); DirPath += ":"; this->AddDisk(DirPath); qDebug()<<"this->USBDisk Path ="<<DirPath; } } break; case DBT_DEVICEREMOVECOMPLETE: if (lpdb -> dbch_devicetype == DBT_DEVTYP_VOLUME) { PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb; if (lpdbv -> dbcv_flags == 0) { qDebug() << "USB_Removed"; DirPath = QString(this->FirstDriveFromMask(lpdbv ->dbcv_unitmask)); DirPath += ":"; this->DeleteDisk(DirPath); qDebug()<<"this-delete is ="<<DirPath; } } break; } } return false;}//=================================================================================//U盘盘符计算//=================================================================================char GetUsbDiskWidget::FirstDriveFromMask(ULONG unitmask){ char i; for (i = 0; i < 26; ++i) { if (unitmask & 0x1) break; unitmask = unitmask >> 1; } return (i + 'A');}//=================================================================================//增加下拉列表选项//=================================================================================void GetUsbDiskWidget::AddComboBoxItem(QString &item){ QStringList ComboboxList = QStringList()<<item; //ComboboxList<<item; ui->comboBox_USB->addItems(ComboboxList);}//=================================================================================//删除下拉列表选项//=================================================================================void GetUsbDiskWidget::DeleteComboBoxItem(QString &item){ int i = ui->comboBox_USB->findText(item); ui->comboBox_USB->removeItem(i);}//=================================================================================//下拉列表选项发生改变//=================================================================================void GetUsbDiskWidget::on_comboBox_USB_currentIndexChanged(QString e){ qDebug()<<" this is test changed ="<<e; int iter; if(this->SearchDisk(e,iter)) { this->CurrentUseDisk = this->usb_disk_info.at(iter); }}//=================================================================================//获取下拉列表当前选定的U盘//=================================================================================USB_DISK_INFO GetUsbDiskWidget::GetCheckedDisk(){ return this->CurrentUseDisk;}
#include <QtGui/QApplication>#include "getusbdiskwidget.h"int main(int argc, char *argv[]){ QApplication a(argc, argv); GetUsbDiskWidget w; w.show(); return a.exec();}
- QT windows平台下获取U盘 QComboBox显示U盘盘符
- U盘盘符不显示
- U盘插入计算机后,Windows资源管理器中不显示U盘盘符
- vc 获取U盘盘符
- VC++获取U盘盘符
- vc 获取U盘盘符
- 插入U盘怎样获取U盘盘符?
- 请问如何通过u盘盘符获取u盘的设备信息
- Delphi自动检测U盘插入、拔出及获取U盘盘符!
- Delphi自动检测U盘插入、拔出及获取U盘盘符
- 固定U盘盘符原理
- U盘盘符不能显示的解决过程
- ubuntu下 U盘盘符重命名修改方法
- 解决U盘盘符消失的系统故障
- windows下 Qt检测U盘(二)
- windows下 Qt检测U盘(二)
- windows下 Qt检测U盘(二)
- VC++获取U盘盘符(各种类型的驱动器都可以)
- iOS 消息推送原理及实现总结
- 神经网络编程入门
- sql的结果集合并
- 破解无线网络密码
- 说学习,是模仿还是要创新?还是模仿加优化?
- QT windows平台下获取U盘 QComboBox显示U盘盘符
- 破解无线网络密码
- hdu 1059 练习练习dp(多重背包)
- 忘我之积
- 第二十八批计算机信息系统集成资质换证专家评审会圆满结束
- Solr 数字字符不能搜索的一个问题
- Mosquitto 0.15 开源MQTT v3.1 Broker
- 机器学习知识点学习
- loadView、viewDidLoad及viewDidUnload的关系