VC/MFC开发中的句柄HWND

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

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对象的使用】

。。。

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

相关推荐

MFC 获得窗口句柄问题大全

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

skdkjxy的专栏 1684

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

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

thanklife的专栏 1万+

VC6 MFC文件详解与配置

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

weixin_34456923的博客 824

Windows入门(一)

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

m0_62573048的博客 1357

图解“交易·支付·清结算·账务”全局

这个过程大致是这样的,用户先到平台选择喜欢的“餐品”,然后“下单”,生成交易“账单”,用户选择支付方式进行“支付”,支付成功后平台要履行承诺把餐送到,“履约”完成以后平台就开始进行各方利益的“清分”,计算清楚应给谁多少钱,并“记账”,最后将款项“结算”给商家,这个过程如图7所示。交易系统请求订单系统创建订单,因为不清楚平台和商家之间的清结算协议,所以暂且认为所有优惠由平台提供给用户,后续平台再基于协议跟商家之间做优惠的分摊,将上述商品、优惠、计价等信息集成到一起,就得到了完成的订单信息了,如表4所示。

wjianwei666的专栏 1万+

通达信+大智慧数据同步存调DLL

数据同步存调DLL(通达信版+大智慧版)

guleba的博客 2053

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

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

sinolover的专栏 2862

【OpenCV3】cv::compare()使用详解

cv::compare()主要用于两个图像之间进行逐像素的比较,并输出比较的结果。具体用法如下: cv::compare() bool cv::compare( cv::InputArray src1, // 输入数组1 cv::InputArray src2, // 输入数组2 cv::OutputArray dst, // 输出数组 int cmpop // 比较操作子,见下表 ...

guduruyu的专栏 9759

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

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

Rachel Zhang的专栏 4万+

Win10系统权限深度解析:如何安全地将C盘所有者从TrustedInstaller变更为Administrators

本文深入解析了Win10系统中C盘文件权限管理的核心机制,解释了为何管理员账户(Administrators)默认无法修改由TrustedInstaller保护的系统文件。文章在强调安全风险的前提下,详细提供了通过图形界面和命令行两种方式,将文件或文件夹所有权从TrustedInstaller安全变更为Administrators的实操步骤,并给出了关键的风险预警与权限恢复方法。

weixin_29305313的博客 549

计量经济学tempdisagg的python库:年度时序变月度

计量经济学tempdisagg的python库:年度时序变月度

素质云笔记 1526

VC_HWND和CWND的概念以及转换

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

优快云-MarkYang 1万+

鸿蒙日历组件进阶:教你打造个性化日程管理界面(支持月份切换)

本文深入探讨了鸿蒙应用开发中自定义日历组件的构建方法。通过详解基于Grid的布局设计、核心日期算法、月份切换逻辑以及事件管理集成,指导开发者打造支持个性化日程管理的高性能日历界面,提升应用交互体验。

weixin_29207149的博客 66

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

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

weixin_34092370的博客 1294

FPGA原型验证(八):SoC设计适配与实现策略

时钟门控在SoC设计中很常见,应该小心处理门控时钟,以成功地在FPGA上原型化SoC设计。现代FPGA综合工具在正确约束的情况下,可以自动处理大多数门控时钟。通过遵循本章中的指导方针,即使具有复杂时钟门控的SoC设计也可以得到处理,并成功地在FPGA上进行原型化。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 477

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

xiaoyun8822的专栏 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

MFC 窗口句柄获取

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

4352

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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的博客 1889

mfc获取窗口句柄

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

zhengliuguo的专栏 3921

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

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

weixin_33199315的博客 4232

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

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

gfjjggg的博客 432

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

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

weixin_39929715的博客 1066

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

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

2172

MFC获取各类指针句柄

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

138
上一篇: __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、付费专栏及课程。

余额充值