需要引用头文件
cpp
#include <windows.h>
#include <dbt.h>
Qt4用
bool winEvent(MSG *m, long *result);
或
bool winEventFilter(MSG *m, long *result);
例如:
cpp
bool USBTest::winEvent(MSG *m, long *result)
{
int msgType = m->message;
if (msgType == WM_DEVICECHANGE) {
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)m->lParam;
switch (m->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));
//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) {
//emit sigUDiskRemove();
}
}
break;
case DBT_DEVNODES_CHANGED:
{
qDebug() << "USB_change";
}
break;
default:
break;
}
}
return QWidget::winEvent(m,result);
}
Qt5用
bool nativeEvent(const QByteArray &eventType, void *message, long *result);
或
bool nativeEventFilter(const QByteArray &eventType, void *message, long *result);
例如:
cpp
bool USBDisk::nativeEvent(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_DEVICEINTERFACE)
{
PDEV_BROADCAST_DEVICEINTERFACE pDevInf = PDEV_BROADCAST_DEVICEINTERFACE(lpdb);
QString device_name = "插入设备(name):" + QString::fromWCharArray(pDevInf->dbcc_name, int(pDevInf->dbcc_size)).toUtf8();
emit sigUDiskCome(device_name);
qDebug() << device_name;
}
break;
case DBT_DEVICEREMOVECOMPLETE:
if (lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
{
PDEV_BROADCAST_DEVICEINTERFACE pDevInf = PDEV_BROADCAST_DEVICEINTERFACE(lpdb);
QString device_name = "移除设备(name):" + QString::fromWCharArray(pDevInf->dbcc_name, int(pDevInf->dbcc_size)).toUtf8();
emit sigUDiskRemove();
qDebug() << device_name;
}
break;
case DBT_DEVNODES_CHANGED:
{
qDebug() << "USB_change";
}
break;
}
}
return QWidget::nativeEvent(eventType, message, result);
}