Winapi 在windows上的Qt中检测USB通知
在我的qt应用程序中,我想将一些应用程序输出数据保存到usb笔驱动器中的文件中。我需要在我的qt应用程序中添加以下功能Winapi 在windows上的Qt中检测USB通知,winapi,qt4,usb,detect,Winapi,Qt4,Usb,Detect,在我的qt应用程序中,我想将一些应用程序输出数据保存到usb笔驱动器中的文件中。我需要在我的qt应用程序中添加以下功能 检测usb驱动器插入 我只有一个usb插槽 插入后,我想知道它的驱动器号和字母,并将电脑中特定位置的文件传输到usb驱动器 有谁能告诉我,我必须使用哪个winapi.lib、.h和.dll文件来获得上述所有功能 如果有人能提供一些代码片段,这将对我非常有帮助。HandleWM_DEVICECHANGE-有关如何在QT中处理windows消息的信息,请参阅 如果wParam是DB
如果有人能提供一些代码片段,这将对我非常有帮助。Handle
WM_DEVICECHANGE
-有关如何在QT中处理windows消息的信息,请参阅
如果wParam是DBT\u DEVICEARRIVAL
,则将LPRAM强制转换为DEV\u BROADCAST\u HDR*
如果结构dbch\u设备类型
是DBT\u DEVTYP\u卷
再次将LPRAM强制转换为DEV\u BROADCAST\u卷*
现在检查dbcv_unitmask
位字段,迭代位0..31,检查相应的驱动器是否与您的USB驱动器匹配
if (wParam == DBT_DEVICEARRIVAL) {
if (((DEV_BROADCAST_HDR *) lParam)->dbch_devicetype == DBT_DEVTYP_VOLUME) {
DWORD Mask = ((DEV_BROADCAST_VOLUME *) lParam)->dbcv_unitmask;
for (int i = 0; i < 32; ++i) {
if (Mask & (1 << i)) {
char RootPath[4] = "A:\\";
RootPath[0] += i;
// Check if the root path in RootPath is your USB drive.
}
}
}
}
if(wParam==DBT\u DEVICEARRIVAL){
如果((DEV_BROADCAST_HDR*)lParam)->dbch_devicetype==DBT_DEVTYP_VOLUME){
DWORD掩码=((开发广播卷*)lParam)->dbcv单元掩码;
对于(int i=0;i<32;++i){
如果(Mask&(1先前的答案现在已过时。以下内容适用于Windows 10上的QT5,其中MainWindow源自QMainWindow:
#include <QByteArray>
#include <windows.h>
#include <dbt.h>
bool MainWindow::nativeEvent(const QByteArray& eventType, void* pMessage, long* pResult)
{
auto pWindowsMessage = static_cast<MSG*>(pMessage);
auto wParam = pWindowsMessage->wParam;
if (wParam == DBT_DEVICEARRIVAL || wParam == DBT_DEVICEREMOVECOMPLETE) {
auto lParam = pWindowsMessage->lParam;
auto deviceType = reinterpret_cast<DEV_BROADCAST_HDR*>(lParam)->dbch_devicetype;
if (deviceType == DBT_DEVTYP_VOLUME) {
auto unitmask = reinterpret_cast<DEV_BROADCAST_VOLUME*>(lParam)->dbcv_unitmask;
for (int i = 0; i < 32; ++i) {
if ((unitmask & (1 << i)) != 0) {
setDriveChanged('A' + i, wParam == DBT_DEVICEARRIVAL);
}
}
}
}
return false;
}
#包括
#包括
#包括
bool主窗口::nativeEvent(常量QByteArray和事件类型,void*pMessage,long*pResult)
{
自动pWindowsMessage=静态_转换(pMessage);
自动wParam=pWindowsMessage->wParam;
如果(wParam==DBT|U设备到达时间| wParam==DBT|U设备移动完成){
自动lParam=pWindowsMessage->lParam;
自动设备类型=重新解释设备类型(lParam)->dbch设备类型;
if(deviceType==DBT\u DEVTYP\u卷){
自动单位掩码=重新解释强制转换(lParam)->dbcv\U单位掩码;
对于(int i=0;i<32;++i){
如果((unitmask&(1)在插入驱动器时会创建一个事件,并给出驱动器号。检测“驱动器号”(可能是USB序列号)要复杂得多,可能可以使用卷标或文件系统序列号。是否有GetSystemPowerStatus(&status)之类的函数;这样我就可以轮询状态了?您能告诉我要使用它必须包含的头文件和.lib文件名吗?