Win32 SDK基础(六)之详解窗口类的查找过程和相关API
发布时间 - 2017-06-06 00:00:00 点击率:次一、窗口类的查找过程
上一文中,我们介绍了windows系统三种窗口类——系统窗口类、全局窗口类和局部窗口类。每种窗口类在操作系统中的作用域不同,而且每个作用域内注册的窗口类名称是不能重复的。而创建窗口时往往会在系统、全局、局部范围按照窗口类名称进行寻找,寻找过程总结如下:
(1)操作系统根据传入的窗口类名称,现在局部窗口类中进行查找,如果找到执行第2步,如果未找到执行第3步。
(2)比较
局部窗口类和创建窗口时传入的HINSTANCE变量。如果发现相等,说明创建和注册的窗口在同一个模块,创建窗口返回。如果不相等,继续执行第3步。
(3)在应用程序全局窗口类中进行查找,如果找到,执行第4步,如果未找到执行第5步。
(4)使用找到的窗口类的信息,创建窗口并返回。
(5)在系统窗口类中查找,如果找到就创建窗口,未找到就是创建窗口失败。
二、注册窗口类的API RegisterClass和RegisterClassEx
RegisterClass和RegisterClassEx都能用于注册窗口类,他们两个的原型分别如下:
ATOM WINAPI RegisterClass( _In_ const WNDCLASS *lpWndClass ); ATOM WINAPI RegisterClassEx( _In_ const WNDCLASSEX *lpwcx );
从API原型上看可以看出,二者的区别主要在于接收的参数上,这个参数就是我们需要注册的窗口类。这两个窗口类声明如下:
typedef struct tagWNDCLASS {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
} WNDCLASS, *PWNDCLASS;typedef struct tagWNDCLASSEX {
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;从上面的代码可以看到,两个窗口类结构体的主要区别在于WNDCLASSEX含有cbSize窗口的结构体大小和hIconSm窗口的小图标句柄。其他参数的含义请自行参考MSDN。
三、获取已注册的窗口信息GetClassInfo
GetClassInfo() API可以获取已经注册的窗口的信息,其函数原型如下:
BOOL WINAPI GetClassInfo( _In_opt_ HINSTANCE hInstance, _In_ LPCTSTR lpClassName, _Out_ LPWNDCLASS lpWndClass );
hInstance—— 是设置查找的作用域,如果设为NULL,会从系统、全局和局部三个作用域查找。
lpClassName —— 是要查找的窗口类名称。
lpWndClass —— 传入的WndClass结构体变量的地址,用于接收窗口类信息。
我们来查找上文创建的Button类的窗口信息:
WNDCLASS wc; if (GetClassInfo(NULL, "Button", &wc) == false) MessageBox(NULL,"GetClassInfo Faile",NULL,NULL);
我们来通过设置断点,查看获取的Button窗口类的信息:
四、卸载窗口类UnregisterClass
我们可以通过UnregisterClass可以将已经注册的窗口类进行卸载,其原型如下:
BOOL WINAPI UnregisterClass( _In_ LPCTSTR lpClassName, _In_opt_ HINSTANCE hInstance );
lpClassName —— 是要卸载的窗口类名称。
hInstance —— 是设置查找的作用域,如果设为NULL,会从系统、全局和局部三个作用域查找。
以下代码,将注册的Button窗口类进行卸载:
if (UnregisterClass("Button",NULL) == false)
MessageBox(NULL, "UnregisterClass Faile", NULL, NULL);
# 宋体
# 未找到
# 类中
# 设为
# 操作系统
# 句柄
# 都能
# 会在
# 我们可以
# 上一
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
bootstrap日历插件datetimepicker使用方法
Android滚轮选择时间控件使用详解
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
html5的keygen标签为什么废弃_替代方案说明【解答】
长沙做网站要多少钱,长沙国安网络怎么样?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
Linux网络带宽限制_tc配置实践解析【教程】
Android自定义listview布局实现上拉加载下拉刷新功能
在Oracle关闭情况下如何修改spfile的参数
如何快速使用云服务器搭建个人网站?
怎样使用JSON进行数据交换_它有什么限制
canvas 画布在主流浏览器中的尺寸限制详细介绍
敲碗10年!Mac系列传将迎来「触控与联网」双革新
公司网站制作需要多少钱,找人做公司网站需要多少钱?
详解jQuery停止动画——stop()方法的使用
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
🚀拖拽式CMS建站能否实现高效与个性化并存?
微信公众帐号开发教程之图文消息全攻略
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
如何用低价快速搭建高质量网站?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
,在苏州找工作,上哪个网站比较好?
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
微信小程序 input输入框控件详解及实例(多种示例)
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
音乐网站服务器如何优化API响应速度?
Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】
如何用PHP快速搭建CMS系统?
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
如何快速搭建二级域名独立网站?
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
非常酷的网站设计制作软件,酷培ai教育官方网站?
Python文件操作最佳实践_稳定性说明【指导】
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
西安专业网站制作公司有哪些,陕西省建行官方网站?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
香港服务器建站指南:免备案优势与SEO优化技巧全解析
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
python中快速进行多个字符替换的方法小结
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
Laravel如何使用Sanctum进行API认证?(SPA实战)
Laravel如何实现文件上传和存储?(本地与S3配置)
Laravel事件监听器怎么写_Laravel Event和Listener使用教程

