2009-07-19 21:05 驅動中識別Usb裝置插入拔出訊息
歡迎看看我的另一個小窩,說不定有意外的驚喜哦 ^_^ www.devres.info
驅動中識別Usb裝置插入拔出訊息 收藏
想要在驅動中捕獲Usb裝置的插入和拔出訊息,還真是有點困難(當然是對於我這半瓶水來說的)。查查網上,到處都提到的是WM_DEVICECHANGE訊息,可是這個是視窗事件,驅動中沒有視窗怎麼辦?沒有視窗自己建吧......
首先,介紹下 WM_DEVICECHANGE 訊息和應用程式檢測方法,只關心我用到的部分。
WindowProc(UINT message, WPARAM wParam, LPARAM lParam); // 訊息處理函數
message == WM_DEVICECHANGE;
wParam == DBT_DEVICEARRIVAL; // 插入裝置
== DBT_DEVICEREMOVECOMPLETE; // 拔出裝置
其次,當我使用應用程式測試成功後,出現新問題了,第一,要讓應用程式和PDA一同啟動;第二,要隱藏應用程式的視窗。第一個問題,貌似可以通過在啟動項建立捷徑的方法解決(沒有實驗......);第二個問題,原以為很簡單,只要設定屬性visible就行了,沒想到不行(我用的是對話方塊程式,在調用ShowWindow也沒用)。這下可就犯難了......(這要是有哪位大哥知道方法,望不吝賜教)
最後,介紹我用的方法——背景程式,說穿了就是一個dll,這個東西在啟動是,是由系統的服務程式載入的,所以可以保證每次啟動時,都可以隨系統運行。再說視窗的問題,就是可以自己控制的了,原來說到底是對mfc機制不熟,不知道它在那又把視窗顯示出來了......
當然除了檢測WM_DEVICECHANGE,還有其他方法也可以擷取USB的插入拔出訊息,可以自己建立訊息佇列,來擷取相應的硬體訊息,此處只做拋磚引玉,未進行深入研究。
首先,使用CreateMsgQueue()建立一個訊息佇列,需要一個MSGQUEUEOPTIONS結構的參數。
其次,訊息佇列建立成功後,使用RequestDeviceNotifications()可以註冊訊息佇列到系統中,這樣就可以擷取相應訊息,這裡的第一個參數我使用NULL,就是檢測所有硬體裝置訊息。
再次,以上完成後,就是等待訊息佇列中訊息到達WaitForSingleObject(hMsg...),使用ReadMsgQueue()讀取訊息即可,此函數的參數類似ReadFile(),讀取到訊息後就是相應的處理了。
最後,關閉註冊到系統的訊息佇列,釋放訊息佇列資源......
通過應用程式測試,可以列印出系統中所有的硬體裝置名稱,在usb裝置插入和拔出時,收到相應的訊息。但是當我們把程式在項目中測試時,發現了新的問題,當佔用Usb裝置連接埠時,此時拔出Usb裝置,兩種方法竟然收不到任何訊息......
最終只好在驅動中輪詢usb裝置連接埠,以此來判定Usb有沒有插入或者拔出。
以上所寫全部為個人理解,限於水平有限,難免存在缺漏和不足,也請看到文章的人海涵。另外說明本部落格內凡是技術文章全部為原創,書寫風格類似於工作筆記,本著尊重個人勞動成果的原則,如需轉載或引用,請添加原始連結或註明出處。