Windows消息机制详解-5
一、 什么是消息
在解释什么是消息之前,我们先讨论一下程序的执行机制问题。大体上说,程序按照执行机制可以分为两类:
第一类是过程驱动。比如我们最早接触编程时写的C程序,又或者单片机程序。这类程序往往预先已经设定好了执行流程,我们执行时只是按部就班的执行;
第二类是事件驱动。事件,相信大家都能够理解。每个事件的发生都是随机的,每个事件都会有发生的时刻,类似生活中的事件。程序中的事件也会有自己的触发点,事件驱动程序就是事先编写好了针对每个事件的处理流程。在Windows的操作系统中,消息就是Windows中的事件。Windows中的几乎每个操作都会触发消息,像我们之前讲过的创建窗口会触发WM_CREATE消息,绘制窗口会触发WM_PAINT消息,我们点击鼠标、键盘、都会触发相应的消息。
Windows的消息被封装成了一个叫做MSG的结构体,其原型如下:
1 2 3 4 5 6 7 8 |
|
Hwnd —— 触发消息的窗口的句柄。
Message —— 消息ID。Windows操作系统为每个消息都分配了一个消息ID,这个ID是唯一的。我们在上文中提到过的WM_CREATE本质就是一个整数,就是消息ID。
wParam —— 消息可附带的参数。
lParam —— 消息可附带的参数。
Time —— 发生消息的时刻。
Pt —— 发生消息时鼠标所在的位置。
以上参数对消息来说,缺一不可。
Windows中就是将一个个消息封装成MSG对象,发送消息时,将这些对象放置到消息队列中;获取消息时,也是获取的这些MSG对象。
二、 消息获取
2.1 消息队列
我们说过,在Windows中几乎每个操作都会触发一条消息,这些消息都被发送到消息队列中。何为消息队列?我们可以将其理解为使用了一个存放Msg对象的先进先出的Deque—— Deque<Msg>。消息队列分为两种,一种是系统消息队列,另外一种是进程消息队列。我们在触发消息后,消息先进入系统消息队列。操作系统处理后会根据消息的的窗口句柄hwnd值将消息分配到我们程序自己的消息队列,然后在我们程序内部进行消息的处理。
2.2 消息循环
在前面的文章中,我们曾经写过一个消息循环。所谓的消息循环,就是不断的读取我们的进程中的消息队里中的消息,然后在进行处理。
1 2 3 4 5 6 7 8 9 |
|
这里面,GetMessage()不断的在消息队列中抓取消息,其函数原型如下:
GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax)
lpMsg —— 用来存放消息的MSG类型的指针。
hWnd —— 指定取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息。
wMsgFilterMin —— 指定被检索的最小消息值的整数。
wMsgFilterMax —— 指定被检索的最大消息值的整数。
GetMessage()获取到消息后,TranslateMessage会将消息进行翻译,主要是把虚拟键消息转换为字符消息。字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数GetMessage或PeekMessage时被读出。Windows中每一个键盘按键,都对应了一个宏,这个键盘按键发出的消息就是虚拟键消息。TranslateMessage的作用就是将虚拟键消息转成字符消息WM_CHAR、WM_SYSCHAR等等。
三、消息处理
DispatchMessage的作用就是将消息,分派到我们实现定义好的窗口处理函数中进行处理,下面是我们在之前的文章中定义的窗口处理函数:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
hWnd就是产生消息的窗口句柄,uMsg是传递的消息,wParam和lParam分别是消息携带的两个参数。在上面的窗口处理函数中,我们定只处理了一个消息WM_DESTROY,这是我们在点击窗口的关闭按钮后产生的一个消息。我们说过,我们在创建窗口是,也会产生一个WM_CREATE消息。下面我们在窗口处理函数中处理这个消息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
我们在接受到WM_CREATE后,会弹出一个对话框。预期的效果是点击这个对话框的确定按钮后才会显示窗口。如下面所示:
运行程序,先弹出对话框:
点击确定按钮后,弹出窗口:
以上就是Win32 SDK关于Windows消息机制的详解(图)的详细内容
参考:windows运维-PHP中文网
Windows消息机制详解-5相关推荐
- windows消息机制详解-3
1. 引言 Windows 在操作系统平台占有绝对统治地位,基于Windows 的编程和开发越来越广泛. Dos 是过程驱动的,而Windows 是事件驱动的[6],这种差别的存在使得很多Dos 程序 ...
- Windows消息机制详解
消息是指什么? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用 ...
- Windows消息机制详解-6
消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用程序某个事情发生了.例如, ...
- Windows消息机制详解-2
消息是指什么? 消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用 ...
- Windows认证机制详解(借物表在文章末尾)
一.本地认证 基础知识 Windows系统在本地认证过程中,操作系统会要求用户输入密码作为凭证去做身份验证. 在验证过程中,系统并不保存明文密码,而是将用户输入的密码转变为NTLM hash(也叫NT ...
- Handler消息机制详解
Handler机制是Android开发中最常见的机制,可以说贯穿整个Android,在探究Handler机制原理之前,我们先来捋一下用法 1.handler.post(Runnable) 2.hand ...
- 【转】Windows消息传递机制详解
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka Windows是一个消息(Message)驱动系统.Windows的消息提供了应用程序之间.应 ...
- Windows消息传递机制详解
Windows是一个消息(Message)驱动系统.Windows的消息提供了应用程序之间.应用程序与Windows系统之间进行通信的手段.应用程序想要实现的功能由消息来触发,并且靠对消息的响应和处理 ...
- Android 消息机制详解(Android P)
前言 Android 消息机制,一直都是 Android 应用框架层非常重要的一部分,想更加优雅的进行 Android 开发,我想了解消息机制是非常必要的一个过程,此前也分析过很多次 Handler ...
最新文章
- hibernate之生成的和默认的属性值(使用generated刷新实体) .
- java jni librtmp_librtmp 编译集成
- 中国红色旅游消费大数据报告(2021)
- sm750显卡驱动linux版,M.2接口也能做显卡,慧荣科技提供图形显示芯片支持
- 测试文档模板_基于模型的测试(贰)
- 使用idea的database模块绘制数据库er图
- 冲量在线荣获STIF2021国际科创节2021年度技术先锋奖
- UML 类图生成工具simpleUML
- MATLAB自带插值函数
- nacos 默认 namespace: public 拿不到数据
- 利用melendy插入参考文献_Q基因的转座子插入突变导致去驯化过程中普通小麦重获脆穗性...
- U盘病毒的传播途径和如何安全使用U盘
- Java导出excel中response.setHeader()参数设置
- MySQL查询优化和参数优化
- html电商app小图标素材,20套购物网站专用的图标素材包
- 计算机网络的标准化工作与相关组织
- APIPOST 常见设置项
- Fortona 4D欧洲之星能维持多久,多久做一次,
- AD快捷键笔记(画板前一定要看看)
- BAD PASSWORD: it is too simplistic/systematic
热门文章
- 最长连续序列Python解法
- oracle 日志切换太频繁,关于oracle日志切换的问题
- python机制_python 加载模块机制
- 我到底去考研,还是工作啊?好纠结
- “你的板子短路了,正在冒烟!”
- linux 系统arp检测工具,linux网络常用诊断工具
- linux 安装python_Linux/Mac/Windows的Rstudio安装Python模块总报错,怎么破?
- abs期刊分类2020_收藏:中科院期刊最新分区来了!| 附516本生物医学等五大领域一区汇总...
- linux磁盘高,CentOS 7.2中磁盘iowait过高解决
- css画个框,用CSS绘制带有边框的尖端