1. 程式人生 > >控制元件子類化與控制元件超類化

控制元件子類化與控制元件超類化

子類化:

子 類化是這樣一種技術,它允許一個應用程式截獲發往另一個視窗的訊息。一個應用程式通過截獲屬於另一個視窗的訊息,從而實現增加、監視或者修改那個視窗的缺 省行為。子類化是用來改變或者擴充套件一個已存在的視窗的行為、而不用重新開發的有效途徑。想要獲得那些預定義控制元件視窗類(按鈕控制元件、編輯控制元件、列表控制元件、下 拉列表控制元件、靜態控制元件和滾動條控制元件)的功能而又要修改它們的某些行為的一個便利的方法就是對它們進行子類化。例如,對於一個在對話方塊中的多行編輯框來說, 當用戶按下Enter鍵時,對話方塊會關閉。通過對編輯控制元件子類化,一個應用程式就能擁有一個可以往文字中插入回車和換行,而同時又不會關閉對話方塊的編輯控制元件,應用程式不用為這個特殊的需要而去專門開發一個編輯控制元件。

提示: 子類化只能用來更改本程序之內的控制元件,但是你可以通過一個附加到其他程序的dll來加入的其他程序中.

可 以利用LoadLibrary來實現(之前把自己準備好的 dll路徑用 WriteProcessMemory 寫入到目標程序中,然後再用GetProcAdress得到LoadLibrary的地址 (kernel32.dll總是被裝入到同一個地方..),最後用CreateRemoteThread建立執行緒......只要在我們準備的dll中的 DllMain完成我們想要的操作..呵呵....)

例如,利用這個獲得標準控制元件的輸入....

超類化:

在你的程式生涯中你肯定遇到過這樣的情況,你需要一系列的控制元件,但它們之間卻只有一點點的不同。例如,你可能需要10個只接受數字的 Edit 控制元件,當然你可以通過多種方法來達到這個目的。

  1. 建立自己的類並用它例項化為那些控制元件
  2. 建立那些 Edit 控制元件並把它們全部子類化
  3. 超類化Edit 控制元件

第 一種方法太乏味了,因為你必須自己實現Edit 控制元件的每個功能,但這項工作不是輕鬆就能完成的。第二種方法好於第一種,但仍然要做許多工作,子類化幾個Edit 控制元件還可以接受,但若要子類化十幾二十個,這項工作簡直就是一場惡夢。在這種情況下就應該使用超類化這個技巧,它是用於控制某一個特定視窗類的特殊方法。 通過這種控制就可以修改視窗類的特性使之符合你的要求,然後再建立那一堆控制元件就可以了。

超類化有如下幾個步驟:

  1. 通過呼叫 GetClassInfoEx 來獲得想要進行超類化操作的視窗類的資訊。函式GetClassInfoEx 需要一個指向 WNDCLASSEX 結構的指標,用於當成功返回時填入視窗類的資訊。
  2. 按需要修改 WNDCLASSEX 結構的成員,其中有兩個成員必須修改:
    hInstance 存放程式的例項控制代碼
    lpszClassName 指向一個新類名的指標
    不必修改成員 lpfnWndProc,但大多數情況下還是需要的。但要記住如果要使用函式 CallWindowProc 呼叫老視窗的過程,那就必須儲存成員 lpfnWndProc 的原值。
  3. 註冊修改完的 WNDCLASSEX 結構,得到一個具有舊視窗類某些特性的新視窗類。
  4. 用新視窗類建立視窗

如果要建立具有相同特性的多個控制元件,超類化就比子類化要好。

總結:

子類化適合於需要修改 少量視窗 的屬性的情況,超類化適合於需要修改 多個視窗 的屬性的情況.

而他們的相同之處在於: 兩個方法都是在原有的控制元件上做少量的修改