面試的時(shí)候被問(wèn)到這個(gè)問(wèn)題, 覺(jué)得越來(lái)越象白癡,什么都不知道.
子類化:
子
類化是這樣一種技術(shù),它允許一個(gè)應(yīng)用程序截獲發(fā)往另一個(gè)窗口的消息。一個(gè)應(yīng)用程序通過(guò)截獲屬于另一個(gè)窗口的消息,從而實(shí)現(xiàn)增加、監(jiān)視或者修改那個(gè)窗口的缺
省行為。子類化是用來(lái)改變或者擴(kuò)展一個(gè)已存在的窗口的行為、而不用重新開(kāi)發(fā)的有效途徑。想要獲得那些預(yù)定義控件窗口類(按鈕控件、編輯控件、列表控件、下
拉列表控件、靜態(tài)控件和滾動(dòng)條控件)的功能而又要修改它們的某些行為的一個(gè)便利的方法就是對(duì)它們進(jìn)行子類化。例如,對(duì)于一個(gè)在對(duì)話框中的多行編輯框來(lái)說(shuō),
當(dāng)用戶按下Enter鍵時(shí),對(duì)話框會(huì)關(guān)閉。通過(guò)對(duì)編輯控件子類化,一個(gè)應(yīng)用程序就能擁有一個(gè)可以往文本中插入回車和換行,而同時(shí)又不會(huì)關(guān)閉對(duì)話框的編輯控件,應(yīng)用程序不用為這個(gè)特殊的需要而去專門開(kāi)發(fā)一個(gè)編輯控件。
以上內(nèi)容來(lái)自:不吃魚的貓 http://tonybain.cnblogs.com/archive/2006/01/19/320366.html
提示: 子類化只能用來(lái)更改本進(jìn)程之內(nèi)的控件,但是你可以通過(guò)一個(gè)附加到其他進(jìn)程的dll來(lái)加入的其他進(jìn)程中.
可
以利用LoadLibrary來(lái)實(shí)現(xiàn)(之前把自己準(zhǔn)備好的 dll路徑用 WriteProcessMemory
寫入到目標(biāo)進(jìn)程中,然后再用GetProcAdress得到LoadLibrary的地址
(kernel32.dll總是被裝入到同一個(gè)地方..),最后用CreateRemoteThread建立線程......只要在我們準(zhǔn)備的dll中的
DllMain完成我們想要的操作..呵呵....)
例如,利用這個(gè)獲得標(biāo)準(zhǔn)控件的輸入....
以上內(nèi)容來(lái)自: Kruglinski http://www.vckbase.com/document/viewdoc/?id=1515
超類化:
在你的程序生涯中你肯定遇到過(guò)這樣的情況,你需要一系列的控件,但它們之間卻只有一點(diǎn)點(diǎn)的不同。例如,你可能需要10個(gè)只接受數(shù)字的 Edit 控件,當(dāng)然你可以通過(guò)多種方法來(lái)達(dá)到這個(gè)目的。
- 創(chuàng)建自己的類并用它實(shí)例化為那些控件
- 創(chuàng)建那些 Edit 控件并把它們?nèi)孔宇惢?
- 超類化Edit 控件
第
一種方法太乏味了,因?yàn)槟惚仨氉约簩?shí)現(xiàn)Edit
控件的每個(gè)功能,但這項(xiàng)工作不是輕松就能完成的。第二種方法好于第一種,但仍然要做許多工作,子類化幾個(gè)Edit
控件還可以接受,但若要子類化十幾二十個(gè),這項(xiàng)工作簡(jiǎn)直就是一場(chǎng)惡夢(mèng)。在這種情況下就應(yīng)該使用超類化這個(gè)技巧,它是用于控制某一個(gè)特定窗口類的特殊方法。
通過(guò)這種控制就可以修改窗口類的特性使之符合你的要求,然后再創(chuàng)建那一堆控件就可以了。
超類化有如下幾個(gè)步驟:
- 通過(guò)調(diào)用 GetClassInfoEx 來(lái)獲得想要進(jìn)行超類化操作的窗口類的信息。函數(shù)GetClassInfoEx 需要一個(gè)指向 WNDCLASSEX 結(jié)構(gòu)的指針,用于當(dāng)成功返回時(shí)填入窗口類的信息。
- 按需要修改 WNDCLASSEX 結(jié)構(gòu)的成員,其中有兩個(gè)成員必須修改:
hInstance 存放程序的實(shí)例句柄
lpszClassName 指向一個(gè)新類名的指針
不必修改成員 lpfnWndProc,但大多數(shù)情況下還是需要的。但要記住如果要使用函數(shù) CallWindowProc 調(diào)用老窗口的過(guò)程,那就必須保存成員 lpfnWndProc 的原值。
- 注冊(cè)修改完的 WNDCLASSEX 結(jié)構(gòu),得到一個(gè)具有舊窗口類某些特性的新窗口類。
- 用新窗口類創(chuàng)建窗口
如果要?jiǎng)?chuàng)建具有相同特性的多個(gè)控件,超類化就比子類化要好。
以上內(nèi)容來(lái)自:Iczelion的Win32匯編教程(17-24)
總結(jié):
子類化適合于需要修改 少量窗口 的屬性的情況,超類化適合于需要修改 多個(gè)窗口 的屬性的情況.
而他們的相同之處在于: 兩個(gè)方法都是在原有的控件上做少量的修改.