[翻译]Win32中安全的子类化 (1)
关于子类化的话题虽然有些旧,但它至今仍然不失为一种开发Windows的强有力技术,在MFC的内核、甚至.NET的内核中都离不开它,希望本连载能对Windows开发的爱好者有所帮助。
原文标题:Safe Subclassing in Win32
作者:Kyle Marsh
MSDN技术组
点击此处查看原文
摘要
本文描述了Win32环境下的子类化,描述了它是如何工作的以及实现安全的子类化必须要遵循的规则。本文涵盖了实例子类化和全局子类化。而超类化则作为一个全局子类化的可选替代方案被介绍。
从Win16到Win32,子类化并没有发生特别显著的变化,但是,在Win32中,一个应用程序还是要遵守几个新的子类化规则。其中最重要(也是最明显的)就是一个应用程序不能子类化属于另一个进程的窗口或者类,除非有工作区提供给应用程序使用,否则这条规则不能被打破。
子类化的定义
子类化是这样一种技术,它允许一个应用程序截获发往另一个窗口的消息。一个应用程序通过截获属于另一个窗口的消息,从而实现增加、监视或者修改那个窗口的缺省行为。子类化是用来改变或者扩展一个已存在的窗口的行为、而不用重新开发的有效途径。想要获得那些预定义控件窗口类(按钮控件、编辑控件、列表控件、下拉列表控件、静态控件和滚动条控件)的功能而又要修改它们的某些行为的一个便利的方法就是对它们进行子类化。例如,对于一个在对话框中的多行编辑框来说,当用户按下Enter键时,对话框会关闭。通过对编辑控件子类化,一个应用程序就能拥有一个可以往文本中插入回车和换行,而同时又不会关闭对话框的编辑控件,应用程序不用为这个特殊的需要而去专门开发一个编辑控件。
子类化基础
创建一个窗口的第一步是填充一个WNDCLASS结构,并调用RegisterClass函数来注册一个窗口类。WNDCLASS结构的其中一个成员是这个窗口类的窗口过程地址,当一个窗口被建立,32位版本的Microsoft Windows操作系统会取出WNDCLASS结构中的窗口过程地址,并把它复制到一个新的窗口信息结构中。当一条消息被发往这个窗口时,Windows通过窗口信息结构中的这个地址调用这个窗口的窗口过程。为了子类化一个窗口,你要用一个新的窗口过程地址取代原窗口过程地址,从而使新的窗口过程可以接收发往原窗口过程的所有消息。
当一个应用程序子类化一个窗口时,它可对消息采取三种操作:(1)把消息传递给原窗口过程;(2)修改消息然后再传递给原窗口过程;(3)不再往下传递消息。
应用程序子类化一个窗口时,可以决定什么情况下对所接收的消息做出反应,应用程序可以在将消息传递给原窗口过程之前或(和)之后处理这条消息。
子类化的类型
有两种子类化的类型,它们是实例子类化和全局子类化。.
实例子类化是子类化一个独立的窗口信息结构,在实例子类化后,只有属于一个特定的窗口实例的消息会被发送到新窗口过程。
全局子类化是替换一个窗口类的WNDCLASS结构中的窗口过程地址,所有在这之后使用该窗口类建立起来的窗口都具有这个被替换的窗口过程地址。全局子类化只对那些在子类化生效之后创建的窗口有效,在进行子类化之前,如果已经存在任何用这个被全局子类化的窗口类创建的窗口,这些已经存在的窗口不会被子类化。如果应用程序想要使子类化对这些已经存在的窗口生效,应用程序必须子类化每一个已经存在的该窗口类的实例。
Win32中安全的子类化 (2)
posted on 2006-01-19 15:56 I.AM.Wright 阅读(3135) 评论(2) 编辑 收藏 举报