句柄的本质
一、书上定义:
<<Microsoft Windows 3 Developer''s Workshop>>(Microsoft Press,by Richard Wilton)
在Windows环境中,句柄是用来标识项目的,这些项目包括:模块(module)、任务(task)、实例 (instance)、文件(file)、内存块(block of memory)、菜单(menu)、
<nobr id="clickeyekey6" style="color:#6600ff; border-bottom:#6600ff 1px dotted; background-color:transparent; text-decoration:underline">控制</nobr>(control)、字体(font)、资源(resource),包括图标(icon),光标 (cursor),字符串(string)等、GDI对象(GDI
object),包括位图(bitmap),画刷(brush),元文件(metafile),调色板(palette),画笔(pen),区域 (region),以及设备描述表(device context)。
<<WINDOWS编程短平快>>(南京大学出版社):
句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。
二、MFC源代码:
#ifdef STRICT
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
DECLARE_HANDLE(HMODULE);
DECLARE_HANDLE(HINSTANCE);
DECLARE_HANDLE(HLOCAL);
DECLARE_HANDLE(HGLOBAL);
DECLARE_HANDLE(HDC);
DECLARE_HANDLE(HRGN);
DECLARE_HANDLE(HWND);
DECLARE_HANDLE(HMENU);
DECLARE_HANDLE(HACCEL);
DECLARE_HANDLE(HTASK);
三、理解:
HANDLE就是PVOID,也就是无类型指针,
上面这些资源的句柄Handles都不过是指向struct的指针,至于这个struct的用处,连M$都说unused了,现在解释下M$这么做的意义,这就是所谓数据封装,你可以在你的程序中把M$的内部结构指针传来传去,可是你却不知道它到底指向的内容是什么。
句柄与指针确实是完全不同的两个概念。句柄仅仅是一个32位整数,WIN32中用于标记某个系统或进程的对象,可以理解为对象索引(由于M$未完全公开相关技术,在一定程度上只能如此理解),这个索引更像是一种映射关系(从句柄到对象指针的映射),而不是纯粹意义上的“数组下标”。
句柄可以理解为用于指向或标识内存的一块“资源”,这些资源如:文件(file)、内存块(block of memory)、菜单(menu)等等。操作系统通过句柄来定位核心对象和系统资源。
指针即为指向内存的“数据或指令”某一单元。
说的确切一点,句柄实际上是一种指向某种资源的指针,但与指针又有所不同:指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。Windows并不希望一般程序修改其内部数据结构,因为这样太不<nobr id="clickeyekey0" style="color:#6600ff; border-bottom:#6600ff 1px dotted; background-color:transparent; text-decoration:underline">安全</nobr>。所以Windows给每个使用GlobalAlloc等函数声明的内存区域指定一个句柄(本质上仍是一个指针,但不要直接操作它),平时你只是在调用API函数时利用这个句柄来说明要操作哪段内存。
四、引喻:
牧童遥指杏花村
牧童的手为指针,杏花村的牌子为句柄,杏花村酒店为对象的实例.
附注:获得窗口句柄三种方法
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)
<nobr id="clickeyekey6" style="color:#6600ff; border-bottom:#6600ff 1px dotted; background-color:transparent; text-decoration:underline">控制</nobr>(control)、字体(font)、资源(resource),包括图标(icon),光标 (cursor),字符串(string)等、GDI对象(GDI
object),包括位图(bitmap),画刷(brush),元文件(metafile),调色板(palette),画笔(pen),区域 (region),以及设备描述表(device context)。
<<WINDOWS编程短平快>>(南京大学出版社):
句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。
二、MFC源代码:
#ifdef STRICT
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
DECLARE_HANDLE(HMODULE);
DECLARE_HANDLE(HINSTANCE);
DECLARE_HANDLE(HLOCAL);
DECLARE_HANDLE(HGLOBAL);
DECLARE_HANDLE(HDC);
DECLARE_HANDLE(HRGN);
DECLARE_HANDLE(HWND);
DECLARE_HANDLE(HMENU);
DECLARE_HANDLE(HACCEL);
DECLARE_HANDLE(HTASK);
三、理解:
HANDLE就是PVOID,也就是无类型指针,
上面这些资源的句柄Handles都不过是指向struct的指针,至于这个struct的用处,连M$都说unused了,现在解释下M$这么做的意义,这就是所谓数据封装,你可以在你的程序中把M$的内部结构指针传来传去,可是你却不知道它到底指向的内容是什么。
句柄与指针确实是完全不同的两个概念。句柄仅仅是一个32位整数,WIN32中用于标记某个系统或进程的对象,可以理解为对象索引(由于M$未完全公开相关技术,在一定程度上只能如此理解),这个索引更像是一种映射关系(从句柄到对象指针的映射),而不是纯粹意义上的“数组下标”。
句柄可以理解为用于指向或标识内存的一块“资源”,这些资源如:文件(file)、内存块(block of memory)、菜单(menu)等等。操作系统通过句柄来定位核心对象和系统资源。
指针即为指向内存的“数据或指令”某一单元。
说的确切一点,句柄实际上是一种指向某种资源的指针,但与指针又有所不同:指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。Windows并不希望一般程序修改其内部数据结构,因为这样太不<nobr id="clickeyekey0" style="color:#6600ff; border-bottom:#6600ff 1px dotted; background-color:transparent; text-decoration:underline">安全</nobr>。所以Windows给每个使用GlobalAlloc等函数声明的内存区域指定一个句柄(本质上仍是一个指针,但不要直接操作它),平时你只是在调用API函数时利用这个句柄来说明要操作哪段内存。
四、引喻:
牧童遥指杏花村
牧童的手为指针,杏花村的牌子为句柄,杏花村酒店为对象的实例.
附注:获得窗口句柄三种方法
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)
分享到:
相关推荐
获取句柄:(ParentName为对应窗口的完整名称(字符串),实在确定不了可以用按键抓抓的句柄抓取获得) parent = win32gui.FindWindow(0,ParentName) 获取子句柄:(ChildClass为子句柄的类名(字符串)) child= ...
一片关于句柄的文章,windows编程必须掌握的知识,希望可以帮到大家啦
句柄之深入解析,学习编程语言必须要掌握的知识
这是matlab图形句柄的相关知识,里面的内容很全,很清楚。希望能给到你们一些帮助。
关于matlab的句柄.ppt,其中概述了matlab的句柄相关知识,以及其应用方法等等
本篇文章给大家详细分析了C++句柄类的相关知识点,对此有需要的朋友跟着学习参考下吧。
在本篇文章里我们给大家详细讲述了易语言句柄的概念以及相关知识点内容,有需要的朋友们可以学习参考下。
PC鼠标定时点击器,模拟移动鼠标句柄模式.zip含下载地址可存云盘
该教程旨在帮助MATLAB的朋友补充相关知识,由浅入深,含实际数学建模案例介绍。 【完整课程列表如下】 MATLAB编程与仿真 MATLAB与科学计算 第1章 基础准备及入门.ppt MATLAB编程与仿真 MATLAB与科学计算 第2章 ...
了解一下Delphi的线程知识,里面用了不少函数,比如: WResult:=WaitForSingleObject(HMutex,INFINITE); //WaitForSingleObject函数来等待一个内核对象变为已通知状态: {DWORD WaitForSingleObject( ...
在本篇内容里我们给大家分享了易语言句柄及局部变量的相关知识点内容,有兴趣的朋友们学习下。
摘要:VB源码,系统相关,托盘图标 vb托盘图标管理器源码,获取托盘图标模块(注:当程序抹改的句柄不取其图标,如一些杀毒),搭配modSysVersion(取当前系统版本),modIconToPic(转换ICON句柄为一般图片文件)...
研究本程序你会了解到一些相关的知识点,比如将客户坐标转化为屏幕坐标并显示在PointText文本框中、获得鼠标所在的窗口句柄并显示在hWndText文本框中、获得该窗口的类型并显示在WndClassText文本框中、向该窗口发送...
计算机网络技术重点知识结构 在计算机网络技术的学习、考试、应用中都有很好的帮助! 六.给定文法G[S]: (此处文法略) 1.文法G属于chomsky哪一型文法? 2.给定符号串,判定该符号串是不是该文法的一个句子,请...
Halcon12与QT混编源代码,用作配置使用。适合新学的同学;深入了解请自行查看例程,以及文档。同时了解相关知识,没有相机使用例子
VC上的界面操作小知识,基于MFC,消息处理函数,图标,对话框, 如何改变窗口,如何改变视窗的背景颜色,如何使能和禁止工具条的工具提示,如何获取应用程序的 实例句柄, 怎样加载其他的应用程序……
VB6写的装入窗体,点击鼠标后可切换窗体中的文字,你可以使用本方法制作一个启动窗体,本例当然比较简单,真正用的时候你会发现还有不少知识需要补充进去,也算是给VB初学者准备的一些基础实例吧。
研究本程序你会了解到一些相关的知识点,比如将客户坐标转化为屏幕坐标并显示在PointText文本框中、获得鼠标所在的窗口句柄并显示在hWndText文本框中、获得该窗口的类型并显示在WndClassText文本框中、向该窗口发送...
2.2 什么是句柄 2.3 谈谈WinMain 函数 (例子代码EX02-00) 2.3.1 WinMain 函数的定义及功能 2.3.2 窗口及其生成 2.3.2.1 如何设计一个窗口类——步骤1 2.3.2.2 注册设计好的窗口类——步骤2 2.3.2.3 创建窗口...
用于执行简单数学运算的 Gui 基础知识和用于绘制结果的坐标轴句柄* 添加* 减法* 乘法* 分配