句柄是一个让你操纵某个对象的标识符。在windows中句柄有很多类型,有的是指针,有的是指向指针的指针,有的是一个数组索引。 但在编程中不需要在乎句柄是怎么样的,因为winapi调用掩盖了句柄操作的细节。
为什么我们需要句柄?
更准确地说,是windows需要句柄。windows需要向程序员提供必要地编程接口,在这些接口中,允许程序员访问、创建和销毁对象。但是,出于封装地考虑,windows并不想向程序员返回指针。指针包含了太多的信息。首先指针给出了对象存储的确切位置;其次,要操作一个指针,程序员必须知道指针所指对象的内部结构特征,也即,windows必须向程序员暴露相应的数据结构,而这些数据结构也许是操作系统想向程序员隐藏的。
如果说COM技术向用户隐藏了数据,只暴露了接口并只允许按接口定义的方法操作数据的话,句柄这种方式则允许你按自己的方式直接操作数据,但windows又不向你直接暴露数据。直接操作数据是程序员需要的,不暴露数据是windows所需要的,句柄封装方式实现了各取所需。 句柄和指针
句柄与指针确实是完全不同的两个概念。句柄仅仅是一个32位整数,WIN32中用于标记某个系统或进程的对象,可以理解为对象索引(由于MS未完全公开相关技术,在一定程度上只能如此理解),这个索引更像是一种映射关系(从句柄到对象指针的映射)。 附注:获得窗口句柄三种方法
1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)
HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName) 2.HWND WindowFromPoint(POINT& Point)//获得当前鼠标光标位置的窗口HWND
3.BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)
BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
附:句柄种类
HACCEL | Handle to an accelerator table. |
HANDLE | Handle to an object. |
HBITMAP | Handle to a bitmap. |
HBRUSH | Handle to a brush. |
HCONV | Handle to a dynamic data exchange (DDE) conversation. |
HCONVLIST | Handle to a DDE conversation list. |
HCURSOR | Handle to a cursor. |
HDC | Handle to a device context (DC). |
HDDEDATA | Handle to DDE data. |
HDESK | Handle to a desktop. |
HDROP | Handle to an internal drop structure. |
HDWP | Handle to a deferred window position structure. |
HENHMETAFILE | Handle to an enhanced metafile. |
HFILE | Handle to a file opened by OpenFile, notCreateFile. |
HFONT | Handle to a font. |
HGDIOBJ | Handle to a GDI object. |
HGLOBAL | Handle to a global memory block. |
HHOOK | Handle to a hook. |
HICON | Handle to an icon. |
HIMAGELIST | Handle to an image list. |
HIMC | Handle to input context. |
HINSTANCE | Handle to an instance. |
HKEY | Handle to a registry key. |
HKL | Input locale identifier. |
HLOCAL | Handle to a local memory block. |
HMENU | Handle to a menu. |
HMETAFILE | Handle to a metafile. |
HMODULE | Handle to a module. |
HMONITOR | Handle to a display monitor. |
HPALETTE | Handle to a palette. |
HPEN | Handle to a pen. |
HRGN | Handle to a region. |
HRSRC | Handle to a resource. |
HSZ | Handle to a DDE string. |
HWINSTA | Handle to a window station. |
HWND | Handle to a window |