NativeWindow是.net Framework提供的一個底層的類。微軟官方的解釋為:NativeWindow Provides a low-level encapsulation of a window handle and a window procedure.說道這 些也相當於沒有說,因為NativeWindow到底是干什麼的也沒有說清楚,意思就是一個低級別的 對窗體句柄和窗體過程的一個封裝。後來查詢了很多的資料才明白了其中的意義。
資料來源:
http://www.diybl.com/course/4_webprogram/asp.net/netjs/2007921/72804.html
這個講解的是《利用NativeWindow監視WndProc消息》,這篇內容比較長,而且頁數比較多 ,經過自己努力和耐心,終於完成了其中的例子,代碼下載地址為: http://files.cnblogs.com/zhjp11/皮膚/NativeWindowApplication.rar
http://www.codeproject.com/KB/dialog/OpenFileDialogEx.aspx
這篇來自CodeProject,老外寫的代碼就是比較有水平。將Windows 的OpenFileDialog子類 化,顯示成了自定義的OpenFileDialog,而且添加了很多的事件。相當的佩服。
經過這兩篇的細心閱讀,終於了解了NativeWindow的作用,NativeWindow就是提供了底層的 封裝,提供了AssignHandle和RealeseHandle這兩個方法,主要就是對注冊了窗體句柄的窗體進 行Hook,將窗體的事件經過自己處理後交給Windows處理。使用Refector.net查看了 NativeWindow中AssignHandle這個方法,也驗證了我這個說法。在AssignHandle中有這樣一段 代碼:
userDefWindowProc = UnsafeNativeMethods.GetProcAddress(new HandleRef (null,UnsafeNativeMethods.GetModuleHandle("user32.dll")), lpProcName);
對Win32開發的也許都知道這段代碼的意義,他也是Hook的一種。不過是更加高級的Hook方 式。這裡就不在細說,我們現在只要知道他可以對我們進行注冊的窗體進行Hook,可以將自己 的代碼加載到我們想要的位置就可以了。
然後我就使用NativeWindow獲取所有的窗體的所有事件,然後輸出Hook到的時間,結果圖如 下:
本文配套源碼