可对windows系统下u盘插入和移除进行检测
调用
///[U盘插入移除检查]
void hhkj_bomTools::componentHelper::uDiskCheckInit(const QObject *recv,
const char* slotCome,
const char* slotRemove)
{
qApp->installNativeEventFilter(UDisk::getInstance());
UDisk::getInstance()->setUDiskComeSlot(recv,slotCome);
UDisk::getInstance()->setUDiskRemoveSlot(recv,slotRemove);
}
///[U盘检查关闭]
void hhkj_bomTools::componentHelper::uDiskCheckUninit()
{
qApp->removeNativeEventFilter(UDisk::getInstance());
}
UDisk类完整代码:
h文件
#ifndef UDISK_H
#define UDISK_H
#include <QObject>
#include <QAbstractNativeEventFilter>
#include <windows.h>
#include <dbt.h>
#include <QScopedPointer>
class UDisk : public QObject, public QAbstractNativeEventFilter
{
Q_OBJECT
public:
static UDisk* getInstance();
explicit UDisk(QObject *parent = 0);
void setUDiskComeSlot(const QObject *recv, const char *slot);
void setUDiskRemoveSlot(const QObject *recv, const char *slot);
protected:
bool nativeEventFilter(const QByteArray &eventType, void *message, long *result);
signals:
void sigUDiskCome(QString uDiskName);
void sigUDiskRemove();
public slots:
private:
static QScopedPointer<UDisk> self;
char FirstDriveFromMask(ULONG unitmask);
};
#endif // UDISK_H
cpp文件
#include "udisk.h"
#include <QDebug>
#include <QMutex>
QScopedPointer<UDisk> UDisk::self;
UDisk *UDisk::getInstance()
{
if (self.isNull()) {
static QMutex mutex;
QMutexLocker locker(&mutex);
if(self.isNull()){
self.reset(new UDisk);
}
}
return self.data();
}
UDisk::UDisk(QObject *parent) : QObject(parent)
{
}
void UDisk::setUDiskComeSlot(const QObject *recv, const char *slot)
{
connect(this, SIGNAL(sigUDiskCome(QString)), recv, QString(slot).toStdString().c_str());
}
void UDisk::setUDiskRemoveSlot(const QObject *recv, const char *slot)
{
connect(this, SIGNAL(sigUDiskRemove()), recv, QString(slot).toStdString().c_str());
}
bool UDisk::nativeEventFilter(const QByteArray &eventType, void *message, long *result)
{
MSG* msg = reinterpret_cast<MSG*>(message);
int msgType = msg->message;
if(msgType==WM_DEVICECHANGE)
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam;
switch (msg->wParam) {
case DBT_DEVICEARRIVAL:
if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if(lpdbv->dbcv_flags ==0)
{
QString USBDisk = QString(this->FirstDriveFromMask(lpdbv ->dbcv_unitmask));
USBDisk += ":";
emit sigUDiskCome(USBDisk);
}
}
break;
case DBT_DEVICEREMOVECOMPLETE:
if(lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if(lpdbv->dbcv_flags == 0)
{
QString USBDisk;
USBDisk = QString(this->FirstDriveFromMask(lpdbv ->dbcv_unitmask));
USBDisk += ":";
emit sigUDiskRemove();
}
}
break;
}
}
return false;
}
char UDisk::FirstDriveFromMask(ULONG unitmask)
{
char i;
for (i = 0; i < 26; ++i)
{
if (unitmask & 0x1)
break;
unitmask = unitmask >> 1;
}
return (i + 'A');
}