WINDOWS 換膚的原理及解析

2021-05-22 16:28:06 字數 1657 閱讀 7648

關於軟體換膚原理其實非常簡單,就是hook + subclass, 替換視窗過程,自己重寫介面繪製,

基本上就是響應wm_paint, wm_ncpaint訊息。但難點就在繪製的處理上,

windows

標準控制項那麼多,每個控制項的表現形式可不一樣。所以基本上所有的工作都集中在控制項的訊息響應上了。

其實,標準控制項是很好做的,捧一本msdn基本都可以搞定。難點都集中在滾動條,選單換膚上。

市面上換膚產品多如牛毛,但真正滾動條和選單換膚上做的很好的真的沒幾個,在滾動條和選單上我也是花費了2年的時間研究。這個庫從2023年初開始動工,到現在已經3年半多了。一般標準控制項的繪製我就不說了,基本查查msdn就可以了。下面我著重說下控制項內部滾動條和選單的換膚原理。

控制項的內部滾動條並不是單獨的控制項,他是windows窗體(或控制項)的組成元素,滾動條換膚的難點就是如何禁止系統繪製,因為滾動條位於非客戶區,當滾動條狀態改變時系統會進行繪製,所以你無論怎麼截獲訊息,都無法讓系統不進行繪製。有些朋友可能用滾動條控制項來代替控制項內部的滾動條,但這是山寨的做法,弊端也是顯而易見的。想讓系統不進行繪製,那你必須全權接管滾動條資訊的管理和繪製,windows提供了有關滾動條的api,比如

getscrollinfo,

setscrollinfo等等,實際上windows在內部維護的對使用者開放的資料結構僅僅是scrollinfo這個結構體而已。那麼,我們可不可以自己維護這個scrollinfo,讓使用者或系統呼叫的滾動條相關操作都被我們所控制,我們來響應。答案是肯定的。這又回到之前我們說的原理hook, 這次需要hook的是api,

將滾動條的操作轉入我們的處理過程,處理後返回給系統。這樣就達到了我們的目的。至於api hook 方法很多,大家在網上一搜就可以找到一堆。

關於選單的換膚,有些朋友可能已經知道選單其實就是乙個視窗類名為」#32768」, 所以你可以通過視窗類名來進行hook了。主要的問題是你怎麼才能獲取到選單的控制代碼呢?對於選單訊息,msdn上只有乙個就是mn_gethmenu, 不錯,就是他。給選單視窗傳送這個訊息就可以獲取選單控制代碼。這下好辦了,有了選單控制代碼,你可以隨便操作了, 就這麼簡單。

還有乙個比較難處理的就是視窗標題欄了,因為標題欄在元素改變時,系統也是會進行自繪的。很多換膚庫(包括skin++)的做法就是避開標題欄,把標題欄風格ws_caption去掉,自己再留出一塊非客戶區再畫標題欄,

這種方法看似完美,其實弊端很多,對於窗體來說ws_caption是乙個很重要的風格。去掉ws_caption系統選單的很多專案就失效了。另外還有其他方便的弊端,比如在

vista

系統下就可能出現系統繪製邊框等等。

所以作為換膚庫,應該盡量避免修改程式的預設屬性和風格。換膚庫好比人的衣服,不能說衣服不合適,就要把骨頭拆了。如何解決這個問題呢?其實有很多方法,比如設定剪裁區,鎖定繪製等等。

總結下來,換膚庫真正說技術,並沒有多麼高深,原理道理很簡單。經過skinsharp開發,小生收穫最多的就是對windows訊息機制的理解,對windows api的運用等等。

當然在牛人面前,小生仍然是個菜鳥。畢竟花了很多心血,所以收費也是有需要的,小生不是大款,說白了就乙個it民工。也需要生活,也需要錢。馬雲說過」免費是世界上最昂貴的東西。所以盡量不要免費。等你有了錢以後再考慮免費。」 雖然不能全部認可,但是還是有道理。

小生也樂意和有這方面興趣的朋友一起討論。

DNS原理及解析過程

就是所謂的 其實我們的 www.baidu.com在配置當中應該是www.baidu.com.最後有一點 一般我們在瀏覽器裡輸入時會省略後面的點,而這也已經成為了習慣。根域伺服器我們知道有13臺,但是這是錯誤的觀點。根域伺服器只是具有13個ip位址,但機器數量卻不是13臺,因為這些ip位址借助了任播...

LVS DR工作原理解析及配置解析

client傳送請求至vip,即訪問服務.請求報文源位址位cip,目標位址位vip.lvs排程器vip接收請求,隨即將報文傳送至input鏈,ipvs核心模組確定請求的服務是配置好 的lvs集群服務,然後根據對應的排程演算法選擇後端的rs,並將目標位址修改為rip的mac位址,而後將請求委派給其處理...

Windows啟動原理及啟動優化

為什麼開機進入系統慢?各種開機啟動故障讓你頭疼?了解啟動的奧妙,對於windows系統管理者來說十分重要,對於啟動時的故障排查 啟動優化有很大幫助 本文將概述計算機啟動的原理並提供多種啟動優化的解決方案。先明確一點,windows7 10和windowsxp的啟動過程是有區別的,如果有人和你講啟動過...