Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > VB.NET > [翻译]Win32中安全的子类化 (1)
【标  题】:[翻译]Win32中安全的子类化 (1)
【关键字】:Win32
【来  源】:http://tonybain.cnblogs.com/archive/2006/01/19/320366.html

[翻译]Win32中安全的子类化 (1)

Your Ad Here

关于子类化的话题虽然有些旧,但它至今仍然不失为一种开发Windows的强有力技术,希望本连载能对Windows开发的爱好者有所帮助。


原文标题:Safe Subclassing in Win32
作者:Kyle Marsh
MSDN技术组

摘要

本文描述了Win32环境下的子类化,描述了它是如何工作的以及实现安全的子类化必须要遵循的规则。本文涵盖了实例子类化和全局子类化。而超类化则作为一个全局子类化的可选替代方案被介绍。
Win16Win32,子类化并没有发生特别显著的变化,但是,在Win32中,一个应用程序还是要遵守几个新的子类化规则。其中最重要(也是最明显的)就是一个应用程序不能子类化属于另一个进程的窗口或者类,除非有工作区提供给应用程序使用,否则这条规则不能被打破。

子类化的定义

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

子类化基础

创建一个窗口的第一步是填充一个WNDCLASS 结构,并调用RegisterClass 函数来注册一个窗口类。WNDCLASS 结构的其中一个成员是这个窗口类的窗口过程地址,当一个窗口被建立,32位版本的Microsoft Windows操作系统会取出WNDCLASS 结构中的窗口过程地址,并把它复制到一个新的窗口信息结构中。当一条消息被发往这个窗口时,Windows通过窗口信息结构中的这个地址调用这个窗口的窗口过程。为了子类化一个窗口,你要用一个新的窗口过程地址取代原窗口过程地址,从而使新的窗口过程可以接收发往原窗口过程的所有消息。
当一个应用程序子类化一个窗口时,它可对消息采取三种操作:(1)把消息传递给原窗口过程;(2)修改消息然后再传递给原窗口过程;(3)不再往下传递消息。
应用程序子类化一个窗口时,可以决定什么情况下对所接收的消息做出反应,应用程序可以在将消息传递给原窗口过程之前或(和)之后处理这条消息。

子类化的类型

有两种子类化的类型,它们是实例子类化全局子类化.

实例子类化是子类化一个独立的窗口信息结构,在实例子类化后,只有属于一个特定的窗口实例的消息会被发送到新窗口过程。
全局子类化是替换一个窗口类的WNDCLASS 结构中的窗口过程地址,所有在这之后使用该窗口类建立起来的窗口都具有这个被替换的窗口过程地址。全局子类化只对那些在子类化生效之后创建的窗口有效,在进行子类化之前,如果已经存在任何用这个被全局子类化的窗口类创建的窗口,这些已经存在的窗口不会被子类化。如果应用程序想要使子类化对这些已经存在的窗口生效,应用程序必须子类化每一个已经存在的该窗口类的实例。

换算网络码:【上一篇】
epoll的安装和调试:【下一篇】
【相关文章】
  • 使用PostThreadMessage在Win32线程间传递消息
  • 与win32/spy.agent.iw过招
  • win32下使用gcc编译供java 调用的dll须知(jini)
  • 跨平台的JAVA调不跨平台的C--(JNI在Win32&&Linux下的使用)
  • Apache 服务器端程序Win32下的编写??
  • win32asm中的参数传递与堆栈
  • [ZT]在.NET Compact Framework 窗体控件中嵌入Win32本机控件
  • ACE在win32平台上的安装,与VC6的集成
  • VOCAL WIN32 INSTALLATION
  • win32多线程搜索的例子
  • 【随机文章】
  • Http.sys
  • 在VC下如何产生随机数?
  • Sun RPC 编程简介
  • 用Fireworks轻松制作网页交互按钮
  • 不用代理直接上维基百科
  • {转}MS06040漏洞的利用
  • 删除索引
  • 很有用的php函数
  • 千兆铜缆主干交换机7004NST
  • GetConsoleWindow ()函数找不到的解决办法
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.