VC/MFC开发中的句柄HWND

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

Windows开发中,经常会碰到一个常见的字眼HWND,如下

   HWND hWnd;
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_VISIBLE,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
HWND就是句柄,那么句柄是什么?

【句柄定义】

先看Windows下面的定义,如下

DECLARE_HANDLE            (HWND);
DECLARE_HANDLE            (HHOOK);
再往下看接续查找DECLARE_HANDLE的定义,如下
#ifdef STRICT //编译级别的选项开关
typedef void *HANDLE;  // void* 
#if 0 && (_MSC_VER > 1000)
#define DECLARE_HANDLE(name) struct name##__; typedef struct name##__ *name
#else
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
#endif
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
typedef HANDLE *PHANDLE;

这里我的编译器采用的是VS2012,_MSC_VER含义如下:

MSVC++ 11.0 _MSC_VER = 1700 (Visual Studio 2012)
MSVC++ 10.0 _MSC_VER = 1600 (Visual Studio 2010)
MSVC++ 9.0  _MSC_VER = 1500 (Visual Studio 2008)
MSVC++ 8.0  _MSC_VER = 1400 (Visual Studio 2005)
MSVC++ 7.1  _MSC_VER = 1310 (Visual Studio 2003)
MSVC++ 7.0  _MSC_VER = 1300
MSVC++ 6.0  _MSC_VER = 1200
MSVC++ 5.0  _MSC_VER = 1100
就进入了宏开关的else分支:
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
展开上面的宏,假设传入的name为obj,展开后的结果
	#define DECLARE_HANDLE(obj) 
	struct obj__
	{
		int unused;
	}; 
	typedef struct obj__ *obj
再将DECLARE_HANDLE            (HWND);展开
	#define DECLARE_HANDLE(HWND) 
	struct HWND__
	{
		int unused;
	}; 
	typedef struct HWND__ *HWND
那么HWND就是一个仅含有一个整型成员变量的结构体对象的地址,这样一来HWND hwnd; 其实就等价于 HWND__* hWnd;

注意:(1)句柄是跨进程可见的,而指针从来都是属于某个特定进程的,这里摘自网上还没验证,但是根据核心编程里面对内核对象的理解,那里指出内核对象是内核地址上的一块区域,应该差不多

           (2)HANDLE、HINSTANCE又是什么呢?

#ifdef STRICT
typedef void *HANDLE;
...
#endif
typedef HANDLE *PHANDLE;

而HINSTANCE的定义域HWND类似,就是HINSTACE__ *

DECLARE_HANDLE(HINSTANCE);

【句柄猜想】

注意:这里是参照Windows核心编程对内核对象的解释

句柄其实就是对象地址的再次封装,防止肆意破坏对象且提供了一种安全的机制权限的一个整型值,这里我们进封装,由于Windows对象很多,需要一个类似索引的表,如

     句柄         地址      ...           权限

     1  0x0000 1200    ????    0x0000 0000

     2  0x0000 3400    ????    0x0000 0001

以上是一种猜测的假设, 这样句柄1的内存地址为0x0000 1200 ,假设权限0x0000 0000 就是无任何权限或者继承当前窗口或者进程的权限

参照上面的定义查询,发现没有权限之类的?why?这个我暂时也没搞懂,总之内核里面会维护一张句柄表,而每次都从那张表中查找具体的对象地址

何为内核对象?何为用户对象?何为GDI对象?

内核对象提供了一种健全的机制,可保证不同用户、不同权限的访问,在创建内核对象必须使用安全标志,并且其分布在内核地址空间某一段内存中,具体地址请查看微软技术丛书,而这两种就是除了上面讲的之外的句柄对象,例如一个窗口的使用,就是一个用户对象的使用;

【GDI对象的使用】

。。。

C++学习(一五一)hwnd hdc hglrc HWND:h是类型描述,表示句柄(handle),Wnd是变量对象描述,表示窗口,所以hWnd表示窗口句柄。Microsoft Windows运行环境,通过给应用程序中的每个窗体和控件分配一个句柄来标识他们。hWnd属性用于Windows API调用。许多Windows运行环境函数需要活动窗口的hWnd作为参数。 HDC:设备上下文是一种包含有关某个设备的绘制属性信息的Windows数据结构。所有绘制调用都通过设备上下文对象进行,这些对象封装了用于绘制线条,形状和文本的Windows API。 HGLR 阅读详情

相关推荐

Windows编程之hdc和hwnd的区别

我刚学习Windows程序设计时,对那些句柄理解很含糊,尤其是HDC和HWND。用的很多,但其实还是不知道两者的真正区别,先来看一下其他博主的理解。 hWnd(Handle of Window,也可以这么说:h是类型描述,表示句柄;wnd是变量对象描述,表示窗口)是窗口句柄,其中包含窗口的属性。例如,窗口的大小、显示位置、父窗口。 hDC(Handle to Device Context...

薰衣草PK向日葵的博客 1万+

获得当前窗口的hwnd的方法整理

获得当前窗口的hwnd的方法整理 我已知获取hwnd的方法有如下一些:   HWND GetActiveWindow(VOID); GetActiveWindow() GetTopWindow() AfxGetMainWnd()->m_hWnd//得到自身的。 HWND hWnd=::FindWindow(NULL,"腾讯QQ系统广播");//查找窗口 GetSa

thanklife的专栏 1万+

MFC 获得窗口句柄问题大全

MFC中获取常见类句柄   本节为VC中常用的文档类,视图类,框架类,应用程序类,自定义类中获取其它四个类的方法:  GET App     AfxGetInstanceHandle()     AfxGetApp()  GET Frame->View->Document      SDI   AfxGetMainWnd() -> GetActiveView() -> GetDocument

skdkjxy的专栏 1677

Windows入门(一)

本文对自己的知识进行一个整理,并帮助刚开始学习win32编程的人一个帮助

m0_62573048的博客 1345

【转】Windows编程之hdc和hwnd的区别

在windows编程中类型名前面加H的基本是句柄常用句柄 : HBITMAP 保存位图信息的内存域的句柄 HBRUSH 画刷句柄 HCTR 子窗口控件句柄 HCURSOR 鼠标光标句柄 HDC 设备描述表句柄 HDLG 对话框句柄 HFONT 字体句柄 HICON 图标句柄 HINSTANCE 应用程序实例句柄 HMENU 菜单句柄 HMODULE 模块句柄 HPALETTE 颜色调色板句柄 HPEN 笔的句柄 HWND 窗口句柄 原文地址: https://blog.csdn.net/wumengl.

sinolover的专栏 2840

MFC 获得各类指针、句柄的方法

最近有些人在问MFC编程一些要点,有一些句柄的获取、指针的获取是常见的问题,本文将对这些问题做以解释,参考了前人的笔录(见reference),希望能够帮助大家更方便地进行MFC程序开发。        一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针和句柄获取和操作问题。本文中将针对各类句柄的获得、指针的获得以及M

Rachel Zhang的专栏 4万+

VC_HWND和CWND的概念以及转换

今天在VC6.0上自己做个测试,验证下HWMD和CWND的概念 自己的理解:下面先说下HWMD的概念,我也不是很理解,应该是SDK接口的概念,并没有实际对象操作的地址空间。 它只是一个32bit的无符号整型数值,代表了句柄号handle 摘自网上的理论: HWND是Windows系统中对所有窗口的一种标识,即窗口句柄。这是一个SDK概念。   CWnd是MFC类库中所有窗口类的

CSDN-MarkYang 1万+

VC中的CWnd指针和HWnd的区别于联系

HWND是Windows系统中对所有窗口的一种标识,即窗口句柄。这是一个SDK概念。 CWnd是MFC类库中所有窗口类的基类。微软在MFC中将所有窗口的通用操作都封装到了这个类中,如:ShowWindow等等,同时它也封装了窗口句柄即m_hWnd成员。 由HWnd得到CWnd*:CWnd wnd;HWnd hWnd;wnd.Attach(hWnd);通常一个窗口资源已经和一个CWnd类的对象...

weixin_34092370的博客 1288

MFC中获取窗口句柄及相关函数

一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针和句柄获取和操作问题。本文中将针对各类句柄的获得、指针的获得以及MFC中常见应用进行阐述并举例。 本文内容索引: ========================================================= MFC中获取常

xiaoyun8822的专栏 2万+

MFC 窗口句柄获取

句柄获取方法(获取该窗口的句柄后,即可向该窗口类类发送消息、处理程序):0。获取所在类窗口的句柄: this->m_hwnd 1。主窗口的句柄: 无论在主窗口类内,还是子窗口类内,获取主窗口句柄的方法: AfxGetMainWnd()->m_hWnd, 如:::SendMessage(AfxGetMainWnd()->m_hWnd,WM_MY_DOSOME,0,(LPA...

4348

VC开发指南--Visual C++/MFC入门教程

VC开发指南1.1 如何学好VC  这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果。万事开头难,为了帮助朋友们更快的掌握VC开发,下面我将自己的一点体会讲一下:  1、需要有好的C/C++基础。正所谓“磨刀不误砍柴工”,最开始接触VC时不要急于开始Windows程序开发,而是应该进行一些字符界面程序的编写。这样做的目的主要是增加对语

zwq040438的专栏 1万+

CWnd与HWND的区别与转换

2011-10-20 10:29:30|  分类: VC学习库|举报|字号 订阅        下载LOFTER我的照片书  | 一、区别 HWND句柄,CWnd是MFC窗体类,CWnd中包含HWND句柄成员对象是m_hWnd. HWND是Windows系统中

qq_31209383的博客 1882

mfc获取窗口句柄

本节为VC中常用的文档类,视图类,框架类,应用程序类,自定义类中获取其它四个类的方法:  GET App     AfxGetInstanceHandle()     AfxGetApp()  GET Frame->View->Document      SDI   AfxGetMainWnd() -> GetActiveView() -> GetDocument()      MDI

zhengliuguo的专栏 3917

c语言 取窗口句柄,MFC获取句柄的方法

句柄获取方法(获取该窗口的句柄后,即可向该窗口类类发送消息、处理程序):例如:::PostMessage("句柄",WM_USER_DRAWVIEWPIC_EDS,0,0);0。获取所在类窗口的句柄:this->m_hwnd1。主窗口的句柄:无论在主窗口类内,还是子窗口类内,获取主窗口句柄的方法:AfxGetMainWnd()->m_hWnd,如:::SendMessage(Af...

weixin_33199315的博客 4224

MFC 获得各类指针 句柄的方法

MFC 获得各类指针 句柄的方法

gfjjggg的博客 428

mfc 找出一个窗口中的所有控件句柄_MFC 获得各类指针、句柄的方法(转)

1、MFC中获取常见类句柄本节为VC中常用的文档类,视图类,框架类,应用程序类,自定义类中获取其它四个类的方法:(1) GET AppAfxGetInstanceHandle()AfxGetApp()(2) GET Frame->View->DocumentSDI AfxGetMainWnd() -> GetActiveView() -> GetDocument()MD...

weixin_39929715的博客 1063

VC句柄、指针、ID之间的转换

 win32直接操作的是句柄HANDLE,每个句柄就对应windows窗口,而vc对HANDLE进行类封装,间接操作的都是HANDLE,现在句柄只是类的一个成员变量。从句柄到指针 CWnd* pWnd=CWnd::FromHandle(hWnd); //a temporary CWnd object is created //and attached. pWnd->Attach(hWnd)

2169

VC6 MFC文件详解与配置

本文还有配套的精品资源,点击获取 简介:Microsoft Foundation Classes (MFC) 是一个面向对象的编程框架,作为Visual C++的一部分,特别是VC6版本,它封装了Windows API,简化了Windows桌面应用程序的开发。文章深入解析了MFC的组件及其实现,并提供了如何在VC6中补充和配置MFC文件的详细步骤,以确保开发环境的完整性和开...

weixin_34456923的博客 820

MFC获取各类指针句柄

最近有些人在问MFC编程一些要点,有一些句柄的获取、指针的获取是常见的问题,本文将对这些问题做以解释,参考了前人的笔录(见reference),希望能够帮助大家更方便地进行MFC程序开发。 一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针和句柄获取和操作问题。本文中将针对各类句柄的获得、指针的...

135
上一篇: __stdcall、__cdecl、CALLBACK、WINAPI区别
下一篇: VC/MFC中如何替换自带滚动条控件的图片
comwise
博客等级 码龄15年 58粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值