窗口句柄的概念
单从概念上讲,句柄指一个对象的标识,而指针是一个对象的内存首地址。从实际处理的角度讲,即可以把句柄定义为指针,又可以把它定义为同类对象数组的索引,这两种处理方法都有优缺点,至于选用哪种方式,完全应该看实际需要,这可以说是一种程序设计上的技巧。那种单纯认为句柄是指针或索引的想法都是机械的、不确切的。其实,在Windows中类似的处理是很多的、很灵活的。再举个相似的例子:我们知道,在Windows中有个函数叫做CallWindowProc。顾名思义,它的作用就是向指定的窗口过程传递一个消息。你也许会想,既然我已经有了窗口过程的指针,为什么我不可以直接通过这个指针调用该函数(这是C语言的内建功能)?事实上,在Win16中确实可以这么做,因为GetWindowLong返回的确实是该函数的指针。但在Win32下,GetWindowLong返回的并不是该函数的指针,而是一个包含函数指针的数据结构的指针(MSDN上说返回的是一个窗口函数地址或它的句柄,就是指的这种情况)。该数据结构是可变的,但只要你使用CallWindowProc来调用的话是不会出错的。这里我们又看到使用句柄处理带来的好处。(补充说明一点:微软在这里之所以这么处理,是为了解决16位/32位以及ANSI/UNICODE的转化问题)
我想问下 我获取了窗口句柄 这个有什么用呢 然后我怎么用这个窗口句柄做一些事情呢
在Windows中,句柄是一个系统内部数据结构的引用。例如当你操作一个窗口,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此你的应用程序就能要求系统对142号窗口进行操作——移动窗口、改变窗口大小、把窗口极小化为图标等。实际上许多Windows API函数把句柄作为它的第一个参数,如GDI(图形设备接口)句柄、菜单句柄、实例句柄、位图句柄等,不仅仅局限于窗口函数。换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口、位图、图标、内存块、光标、字体、菜单等。
为什么我们需要句柄? 更准确地说,是windows需要句柄。windows需要向程序员提供必要地编程接口 ,在这些接口中,允许程序员访问、创建和销毁对象。但是,出于封装地考虑,wi ndows并不想向程序员返回指针。指针包含了太多的信息。首先指针给出了对象存储 的确切位置;其次,要操作一个指针,程序员必须知道指针所指对象的内部结构特 征,也即,windows必须向程序员暴露相应的数据结构,而这些数据结构也许是操作 系统想向程序员隐藏的。 如果说COM技术向用户隐藏了数据,只暴露了接口并只允许按接口定义的方法操 作数据的话,句柄这种方式则允许你按自己的方式直接操作数据,但windows又不向 你直接暴露数据。直接操作数据是程序员需要的,不暴露数据是windows所需要的, 句柄封装方式实现了各取所需