Windows下的U盘监控
生活随笔
收集整理的這篇文章主要介紹了
Windows下的U盘监控
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
// Windows應用程序都是基于消息/事件驅動的,任何一個窗口都能接收消息,并對該消息作出相應的處理。// U盤等移動設備的插入或者移除操作有與之對應的消息-WM_DEVICECHANGE。實現監控U盤的插入和拔出,只需要捕獲這個消息并對它進行處理即可實現。// PS:WindowProc函數:
// 功能:消息處理回調函數。
// 原型:LRESULT CALLBACK WindowProc (
// HWND hwnd,
// UINT uMsg,
// WPARAM wParam,
// LPARAM lParam
// )
// 參數:hwnd:指定窗口的句柄。
// uMsg:消息ID,是一個枚舉值,這里是WM_DEVICECHANGE.
// wParam:消息附帶的參數,改參數可以是Dbt.h頭文件中的以下值之一:
// DBT_CONFIGCHANGECANCELED:更改當前配置(插入或移除)的請求已取消。
// DBT_CONFIGCHAGED:由于插入或移除,當前配置已更改。
// DBT_CUSTOMLEVEL:發生了自定義事件。
// DBT_DEVICEARRIVAL:已插入了設備或介質,現在可以使用它。
// DBT_DEVICEQUERYREMOVE:請求刪除設備或介質的權限。
// DBT_DEVICEREMOVECOMPLETE:已刪除設備或介質。
// DBT_DEVICEREMOVEPENDING:即將刪除一個介質或設備。
// DBT_DEVICETYPESPECIFIC:設備發生特定事件。
// DBT_DEVNODES_CHANGED:已將設備添加到系統或從系統中刪除。
// DBT_QUERYCHANGECONFIG:請求權限更改當前配置。
// DBT_USERDEFINED:此消息的含義是由用戶自己定義。
// lParam:指向由事件特定的數據結構的指針。其格式取決于wParam參數的值。
// 結果:若返回TRUE表示授予請求。若返回BROADCAST_QUERY_DENY表示拒絕該請求。// PS:監控U盤插入或刪除,wParam應當為DBT_DEVICEREMOVECOMPLETE和DBT_DEVICEARRIVAL兩個。// PS:DEV_BROADCAST_HDR結構:
// 定義:typedef struct _DEV_BROADCAST_HDR {
// DWORD dbch_size;
// DWORD dbch_devicetype;
// DWORD dbch_reserved;
// } DEV_BROADCAST_HDR, *PDEV_BROADCAST_HDR;
// 成員:dbch_size:指向這個結構的代銷。如果這是由用戶自定義的事件,則該成員必須是此標頭的大小加上DEV_BROADCAST_USERDEFINED結構中的可變長度數據的大小。
// dbch_devicetype:指定設備類型,確定前三個成員之后的事件特定信息。為以下值之一:
// DBT_DEVTYP_DEVICEINTERFACE:設備類,對應DEV_BROADCAST_DEVICEINTERFACE結構。
// DBT_DEVTYP_HANDLE:文件系統句柄,對應DEV_BROADCAST_HANDLE結構。
// DBT_DEVTYP_OEM:OEM或IHV定義的設備類型,對應DEV_BROADCAST_OEM結構。
// DBT_DEVTYP_PORT:端口設備,對應DEV_BROADCAST_PROT結構。
// DBT_DEVTYP_VOLUME:邏輯卷,對應DEV_BROADCAST_VOLUME結構。
// dbch_reserved:保留。// PS:DEV_BROADCAST_VOLUME結構:
// 定義:typedef struct _DEV_BROADCAST_VOLUME {
// DWORD dbcv_size;
// DWORD dbcv_devicetype;
// DWORD dbcv_reservced;
// DWORD dbcv_unitmask;
// WORD dbcv_flags;
// } DEV_BROADCAST_VOLUME, *PDEV_BROADCAST_VOLUME;
// 參數:前面三個成員和DEV_BROADCAST_HDR相同。
// dbcv_unitmask:標識一個或多個邏輯單元的位源碼。掩碼中的每位對應于一個邏輯驅動器。位0標識驅動器A,位1標識驅動器B,以此類推。
// dbcv_flags:DBTF_MEDIA:更改影響驅動器的介質。DBTF_NET:指示邏輯卷是一個網絡卷。// PS:實現原理:
// 在消息回調函數WindowProc中攔截設備操作對應的消息WM_DEVICECHANGE,再判斷wparam參數的類型,如果是DBT_DEVICEARRIVAL表示設備插入成功,
// 如果是DBT_DEVICEREMOVECOMPLETE表示設備移除成功。先將lparam轉為DBT_BROADCAST_HDR,去其成員dbcv_deivcetype,U判斷操作對應DEV_BROADCAST_VOLUME,
// 然后再講lparam轉變為DEV_BROADCAST_VOLUME結構體,獲取成員dbcv_unitmask,這是一個位掩碼,使用for循環來對它的每一位檢測,其位上為1在獲取到其盤符。// 示例代碼:BEGIN_MESSAGE_MAP(...)ON_MESSAGE(WM_DEVICECHANGE, OnDeviceChange)
END_MESSAGE_MAP()LRESULT OnDeviceChange(WPARAM wParam, LPARAM lParam)
{switch (wParam){// 設備已插入case DBT_DEVICEARRIVAL:// 設備已移除case DBT_DEVICEREMOVECOMPLETE:{// 轉換結構體PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;// 邏輯卷if (DBT_DEVTYP_VOLUME == lpdb.dbcv_devicetype){// 根據decv_unitmask計算出設備盤符PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;DWORD dwDriverMask = lpdbv->dbcv_unitmask;DWORD dwTemp = 1;char szDriver[4] = "A:\\";for (szDriver[0] == 'A'; szDriver[0] <= 'Z'; ++szDriver[0]){if (0 < dwTemp & dwDriverMask){// 獲取設備盤符::MessageBox(NULL, szDriver, "設備已插入", MB_OK);// MessageBox(NULL, szDriver, "設備已移除", MB_OK);}// 移位操作dwTemp = (dwTemp << 1);}}}break;default:break;}
}
總結
以上是生活随笔為你收集整理的Windows下的U盘监控的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言直接输出PDF,C语言格式化输出总
- 下一篇: 《Windows核心编程》读书笔记四 进