日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows下的U盘监控

發布時間:2024/1/8 windows 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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盘监控的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。