当应用程序创建一个窗口时,操作系统会分配一个存储区块,用于存储特定于窗口的信息,包括处理窗口消息的窗口过程的地址。当Windows需要将消息传递到窗口时,它将搜索窗口特定的信息以获取窗口过程的地址,并将消息传递给该过程。
【子类】是一种技术,允许应用程序拦截和处理发送或发布到特定窗口的消息,然后窗口有机会处理它们。通过对窗口进行子类化,应用程序可以扩展,修改或监视窗口的行为。虽然不推荐使用,但应用程序可以对任何窗口进行子类化,包括属于系统全局类的窗口,例如编辑控件或列表框。例如,应用程序可以对编辑控件进行子类化,以防止控件接受某些字符。有关所涉风险的说明,请参阅以下部分。
应用程序通过将窗口的原始窗口过程的地址替换为新窗口过程的地址(称为【子类程序】)来对窗口进行子类化。此后,子类过程接收发送或发布到窗口的任何消息。
子类过程在接收到消息时可以采取三种操作:它可以将消息传递到原始窗口过程,修改消息并将其传递给原始窗口过程,或处理消息,而不将其传递给原始窗口过程。如果子类过程处理消息,则它可以在将消息传递到原始窗口过程之前,之后或之前进行。
Windows提供了两种类型的子类:instance和global。在【实例子类化】中,应用程序将替换窗口的单个实例的窗口过程地址。应用程序必须使用实例子类来对现有窗口进行子类化。在【全局子类化】中,应用程序将窗口类的WNDCLASS结构中的窗口过程的地址替换。使用该类创建的所有后续窗口都具有子类过程的地址,但该类的现有窗口不受影响。