最近遇到一個難題——在Windows下用Qt實作U盤彈出、插入、拔出的監聽。其實質是獲取Windows的相關訊息。之前沒有相關處理經驗,于是一頓搜索,找到如下方案,但僅能監聽到U的插入、拔出事件,對U盤的彈出(U盤盤符|右鍵|彈出)無法監聽到:
bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
//處理Windows系統訊息
MSG* msg = (MSG*)message;
int msgType = msg->message;
if(msgType == WM_DEVICECHANGE) //Windows設備訊息
{
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)
{
qDebug() << "USB_設備物理插入";
}
}
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_設備物理拔出";
}
}
break;
}
}
return false;
}
對于msg->wParam訊息引數中的其它型別分別都測驗過,沒有一個是用于標記“U盤彈出”的訊息事件,引數型別列舉如下:
DBT_DEVICEREMOVEPENDING
DBT_CONFIGCHANGECANCELED
DBT_CUSTOMEVENT
DBT_DEVICEQUERYREMOVE
DBT_DEVICEQUERYREMOVEFAILED
DBT_DEVNODES_CHANGED
DBT_QUERYCHANGECONFIG
DBT_USERDEFINED
在此求助有過相關處理經驗或資料的同仁提供解決思路或者方案,謝謝!
uj5u.com熱心網友回復:
Process Monitor 實時監視檔案系統、注冊表、行程、執行緒和 DLL 活動。 http://www.microsoft.com/china/technet/sysinternals/utilities/processmonitor.mspxWinAPIOverride http://jacquelin.potier.free.fr/winapioverride32/
uj5u.com熱心網友回復:
還可以試試用Spy++監視Windows訊息。uj5u.com熱心網友回復:
對Windows編程不太熟悉,針對這個問題搜索的目標比較寬泛,找了幾天也沒一點頭緒......uj5u.com熱心網友回復:
沒有找到對應的“U盤彈出訊息”,只能另辟蹊徑,通過定時輪詢的方式查看哪些U盤被彈出。在微軟的在線msdn上查到一個函式:https://msdn.microsoft.com/en-us/library/ff539806(v=vs.85).aspx
CM_Request_Device_Eject function
The CM_Request_Device_Eject function prepares a local device instance for safe removal, if the device is removable. If the device can be physically ejected, it will be.
Syntax
C++
CMAPI
CONFIGRET
WINAPI CM_Request_Device_Eject(
_In_ DEVINST dnDevInst,
_Out_opt_ PPNP_VETO_TYPE pVetoType,
_Out_opt_ LPTSTR pszVetoName,
_In_ ULONG ulNameLength,
_In_ ULONG ulFlags
);
借用這個函式,暫時就用“輪詢”方式貨值U盤彈出,后面如果有幸能找到會再次一并附上……
uj5u.com熱心網友回復:
樓主,這個問題你解決了么?我目前也在做這個事情,并沒有找到相應的解決方案,求指教
uj5u.com熱心網友回復:
您好,還沒有解決呢!不知道金山/360是怎么做到監測用戶“右鍵盤符|彈出”操作。如果您后續找到相關解決方法,請附在此帖處,謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/106820.html
標籤:Windows客戶端使用
