旅途

如果想飞得高,就该把地平线忘掉

超类化与子类化

面试的时候被问到这个问题, 觉得越来越象白痴,什么都不知道.

 

子类化:

子 类化是这样一种技术,它允许一个应用程序截获发往另一个窗口的消息。一个应用程序通过截获属于另一个窗口的消息,从而实现增加、监视或者修改那个窗口的缺 省行为。子类化是用来改变或者扩展一个已存在的窗口的行为、而不用重新开发的有效途径。想要获得那些预定义控件窗口类(按钮控件、编辑控件、列表控件、下 拉列表控件、静态控件和滚动条控件)的功能而又要修改它们的某些行为的一个便利的方法就是对它们进行子类化。例如,对于一个在对话框中的多行编辑框来说, 当用户按下Enter键时,对话框会关闭。通过对编辑控件子类化,一个应用程序就能拥有一个可以往文本中插入回车和换行,而同时又不会关闭对话框的编辑控件,应用程序不用为这个特殊的需要而去专门开发一个编辑控件。

以上内容来自:不吃鱼的猫 http://tonybain.cnblogs.com/archive/2006/01/19/320366.html

提示: 子类化只能用来更改本进程之内的控件,但是你可以通过一个附加到其他进程的dll来加入的其他进程中.

可 以利用LoadLibrary来实现(之前把自己准备好的 dll路径用 WriteProcessMemory 写入到目标进程中,然后再用GetProcAdress得到LoadLibrary的地址 (kernel32.dll总是被装入到同一个地方..),最后用CreateRemoteThread建立线程......只要在我们准备的dll中的 DllMain完成我们想要的操作..呵呵....)

例如,利用这个获得标准控件的输入....

以上内容来自: Kruglinski  http://www.vckbase.com/document/viewdoc/?id=1515

 

超类化:

在你的程序生涯中你肯定遇到过这样的情况,你需要一系列的控件,但它们之间却只有一点点的不同。例如,你可能需要10个只接受数字的 Edit 控件,当然你可以通过多种方法来达到这个目的。

  1. 创建自己的类并用它实例化为那些控件
  2. 创建那些 Edit 控件并把它们全部子类化
  3. 超类化Edit 控件

第 一种方法太乏味了,因为你必须自己实现Edit 控件的每个功能,但这项工作不是轻松就能完成的。第二种方法好于第一种,但仍然要做许多工作,子类化几个Edit 控件还可以接受,但若要子类化十几二十个,这项工作简直就是一场恶梦。在这种情况下就应该使用超类化这个技巧,它是用于控制某一个特定窗口类的特殊方法。 通过这种控制就可以修改窗口类的特性使之符合你的要求,然后再创建那一堆控件就可以了。

超类化有如下几个步骤:

  1. 通过调用 GetClassInfoEx 来获得想要进行超类化操作的窗口类的信息。函数GetClassInfoEx 需要一个指向 WNDCLASSEX 结构的指针,用于当成功返回时填入窗口类的信息。
  2. 按需要修改 WNDCLASSEX 结构的成员,其中有两个成员必须修改:
    hInstance 存放程序的实例句柄
    lpszClassName 指向一个新类名的指针
    不必修改成员 lpfnWndProc,但大多数情况下还是需要的。但要记住如果要使用函数 CallWindowProc 调用老窗口的过程,那就必须保存成员 lpfnWndProc 的原值。
  3. 注册修改完的 WNDCLASSEX 结构,得到一个具有旧窗口类某些特性的新窗口类。
  4. 用新窗口类创建窗口

如果要创建具有相同特性的多个控件,超类化就比子类化要好。

以上内容来自:Iczelion的Win32汇编教程(17-24)

 

总结:

子类化适合于需要修改 少量窗口 的属性的情况,超类化适合于需要修改 多个窗口 的属性的情况.

而他们的相同之处在于: 两个方法都是在原有的控件上做少量的修改.

posted on 2007-07-18 00:50 旅途 阅读(594) 评论(0)  编辑 收藏 引用 所属分类: 深入windows


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理