qt识别硬件盘符/USB设备

识别硬件盘符

#ifdef WIN32
#include <windows.h>
#endif
void ScanHD()
{
    QFileInfoList list =  QDir::drives();  //获取当前系统的盘符
    QString path;
    bool bUsb = false;
    for(int i=0;i<list.count();i++)
    {
        path = list[i].filePath();
        qDebug()<<path;
        //windows API的头文件中,GetDriveType的参数是PCWCH或者LPCWCH类型,需要进行转换,
        //查看typedef CONST WCHAR *LPCWCH, *PCWCH;
        //typedef wchar_t WCHAR;    // wc,   16-bit UNICODE character
        UINT ret = GetDriveType((WCHAR *) path.utf16());
        qDebug()<<ret;
        if(ret == DRIVE_REMOVABLE)
        {
            qDebug()<<"存在可移动盘:"<<path;
            bUsb = true;
            this->AddDisk(path);
        }
    }
}

注册USB事件监听USB设备插拔

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、使用步骤

#include "MainWindow.h"
#include <QDebug>

#ifdef WIN32
#include <windows.h>
#include <winioctl.h> 
//#include <WinUser.h>
#include <devguid.h>
//#include <SetupAPI.h>
#include <usbiodef.h>
#include <initguid.h>
#include <dbt.h>

static const GUID GUIDList[] =
{
    { 0xA5DCBF10, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } }, // GUID_DEVINTERFACE_USB_DEVICE
    { 0x53f56307, 0xb6bf, 0x11d0, { 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b } }, // GUID_DEVINTERFACE_DISK
    //{ 0x4D1E55B2, 0xF16F, 0x11CF, { 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 } }, // GUID_DEVINTERFACE_HID
    //{ 0xad498944, 0x762f, 0x11d0, { 0x8d, 0xcb, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c } }, // GUID_NDIS_LAN_CLASS
    //{ 0x86e0d1e0, 0x8089, 0x11d0, { 0x9c, 0xe4, 0x08, 0x00, 0x3e, 0x30, 0x1f, 0x73 } }, // GUID_DEVINTERFACE_COMPORT
    //{ 0x4D36E978, 0xE325, 0x11CE, { 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18 } }, // GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR
    //{ 0x97F76EF0, 0xF883, 0x11D0, { 0xAF, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x84, 0x5C } }, // GUID_DEVINTERFACE_PARALLEL
    //{ 0x811FC6A5, 0xF728, 0x11D0, { 0xA5, 0x37, 0x00, 0x00, 0xF8, 0x75, 0x3E, 0xD1 } } // GUID_DEVINTERFACE_PARCLASS
    { 0xF18A0E88, 0xC30C, 0x11D0, {0x88, 0x15, 0x00, 0xA0, 0xC9, 0x06, 0xBE, 0xD8}} // GUID_DEVINTERFACE_USB_HUB
};

bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
#ifdef WIN32
	if (eventType == "windows_generic_MSG")
	{
		MSG *param = static_cast<MSG *>(message);
		switch (param->message)
		{
			case WM_COPYDATA:
			{
				COPYDATASTRUCT *cds = reinterpret_cast<COPYDATASTRUCT*>(param->lParam);
				if (cds->dwData == 10000) 
				{
					QString strMessage = QString::fromUtf8(reinterpret_cast<char*>(cds->lpData), cds->cbData);
					onReceivedMessage(0, strMessage.toUtf8());
					*result = 1;
					return true;
				}
			}
		}
		OnWindowsEvent(message);
	}
#endif

	return QWidget::nativeEvent(eventType, message, result);
}

void MainWindow::InitWindowsEvent()
{
    RegisterFilter();
}

void MainWindow::RegisterFilter()
{
    HDEVNOTIFY hDevNotify;
    DEV_BROADCAST_DEVICEINTERFACE NotifacationFiler;
    ZeroMemory(&NotifacationFiler, sizeof(DEV_BROADCAST_DEVICEINTERFACE));
    NotifacationFiler.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
    NotifacationFiler.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;

    for (int i = 0; i < sizeof(GUIDList) / sizeof(GUID); i++)
    {
        NotifacationFiler.dbcc_classguid = GUIDList[i];

        hDevNotify = RegisterDeviceNotification((HANDLE)this->winId(), &NotifacationFiler, DEVICE_NOTIFY_WINDOW_HANDLE);
        if (!hDevNotify)
        {
            //int Err = GetLastError();
        }
    }
}

void MainWindow::OnWindowsEvent(void *message)
{
    MSG *msg = reinterpret_cast<MSG*>(message);
    if (msg->message == WM_DEVICECHANGE)
    {
        PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam;

        switch (msg->wParam)
        {
        case DBT_DEVICEARRIVAL:
        {
            if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//移动存储设备
            {
            }
            else if (lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) // interface
            {
                PDEV_BROADCAST_DEVICEINTERFACE devInterface;
                devInterface = (PDEV_BROADCAST_DEVICEINTERFACE)lpdb;

                QString interfaceName = QString::fromWCharArray(devInterface->dbcc_name);
				qDebug() << "Desktop DBT_DEVICEARRIVAL dbcc_name: " << interfaceName;

                //监听到有USB设备插拔,识别设备并处理
            }
            else if (lpdb->dbch_devicetype == DBT_DEVTYP_HANDLE) {}
            else if (lpdb->dbch_devicetype == DBT_DEVTYP_PORT) {}
            else if (lpdb->dbch_devicetype == DBT_DEVTYP_OEM) {}

            break;
        }

        case DBT_DEVICEREMOVECOMPLETE:
        {
            if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)//移动存储设备
            {
            }
            else if (lpdb->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) // Interface
            {
                PDEV_BROADCAST_DEVICEINTERFACE devInterface;
                devInterface = (PDEV_BROADCAST_DEVICEINTERFACE)lpdb;

                QString interfaceName = QString::fromWCharArray(devInterface->dbcc_name);
				qDebug() << "Desktop DBT_DEVICEREMOVECOMPLETE dbcc_name: " << interfaceName;
                //FXVCIManager::Instance()->OnDeviceDetch(interfaceName);
            }
            else if (lpdb->dbch_devicetype == DBT_DEVTYP_HANDLE) {}
            else if (lpdb->dbch_devicetype == DBT_DEVTYP_PORT) {}
            else if (lpdb->dbch_devicetype == DBT_DEVTYP_OEM) {}

            break;
        }
        default:
            break;
        }
    }
}

#endif

检测SD

有空再写

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值