Windows API的消息处理机制
上个学期找实习失利,让我觉得自己基础打得不够牢固,所以在华为实习的这三个月里,每天下班都在复习理论课的知识,顺便刷了一个月的 LeetCode。本来以为找工作是势在必得了,结果这个学期秋季校招的坑爹经历导致现在还没有拿到一家公司的 offer。华为实习一结束,回学校的第二天就去参加了 360 在广州的笔试,进了面试以后却又喜闻乐见地一面就被干掉了。再加上之前 milo yip 大大对我提的建议,思来想去,感觉还是自己的简历不够拿得出手。现在开始都没剩下几家想进的公司了,为了不失业只能提早为明年的春招做准备了 T_T。
昨天在京东买的《游戏引擎架构》送到了,大致翻阅了一遍后,我便决定开始编写自己的游戏引擎了。2014年10月20日,Rune Words Game Engine项目正式宣布启动!
第一天,我主要对要实现的模块进行了初步构思,在 github 上建立了资源仓库。
今天是第二天,我重温了一下 Ogre 和自己原来做的游戏的源代码,然后决定从渲染窗口开始写起,要建立窗口就不得不考虑窗口类如何对消息进行处理,于是查阅了一下 Windows API 消息处理的资料,现在将自己的理解整理记录一下。
本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4041700.html
1. 在使用 Windows API 编写窗口程序时,我们主要通过以下几个函数对消息进行处理:
① BOOL WINAPI GetMessage(LPMSG lpMsg, HWND hWnd, UNIT wMsgFilterMin, UINT wMsgFilterMax);
② BOOL WINAPI PeekMessage(LPMSG lpMsg, HWND hWnd, UNIT wMsgFilterMin, UINT wMsgFilterMax, UNIT wRemoveMsg);
GetMessage 函数和 PeekMessage 函数的作用都是从系统的消息队列中获取消息,如果成功得到消息的话返回 true,否则返回 false。所不同的是,GetMessage 在消息队列为空(即无法获取消息)时会进入等待,直到获取到一个消息为止;PeekMessage 无论是否成功获取到消息,都会立即返回。
③ BOOL WINAPI TranslateMessage(const MSG *lpMsg);
TranslateMessage 函数的作用类似于“将 WM_KEYDOWN+WM_KEYUP 的组合消息转换为字符消息 WM_CHAR(一个按键的按下和释放表示输入了一个字符)”,若发生转换返回 true,否则返回 false。注意,转换后的消息是新生成的,lpMsg 指向的消息并不会被修改。
④ LRESULT WINAPI DispatchMessage(const MSG *lpMsg);
DispatchMessage 函数的作用是将消息发送给窗口程序,让窗口函数调用回调函数 WNDPROC 对消息进行处理。
⑤ LRESULT (CALLBACK* WNDPROC)(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
实际上,WNDPROC 并不是一个函数,而是一个函数指针,指向用于响应窗口消息的消息处理函数,它应该在窗口初始化前被赋值。
⑥ BOOL WINAPI PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
⑦ LRESULT WINAPI SendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
PostMessage 函数和 SendMessage 函数都用于发送消息,不同的地方是:PostMessage 只负责将消息放入到消息队列中,之后便立即返回(不管消息是否被处理);SendMessage 要等到收到消息的返回码后才会返回(等待直到确认消息被处理)。
2. 在上述函数的参数中,LPMSG(Long Ptr of Message)是指向存储消息的结构体(MSG)的指针;HWND(Handle of Window)是窗口的句柄(也是一个指向结构体的指针)。
3. 利用这些 Windows API,一个完整的消息循环处理流程可以表示如下:
PeekMessage / GetMessage —true—> TranslateMessage
↑ ↓
WindowProc <————————— DispatchMessage
4. 消息循环处理的代码示例:
// Author DaBianYiLuoKuang.
// http://www.cnblogs.com/dbylk/ // Main message loop
MSG msg = { };
while (WM_QUIT != msg.message)
{
if (PeekMessage(&msg, NULL, , , PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Sleep();
// DoSomething
}
}
Windows API的消息处理机制的更多相关文章
- Qt 事件系统浅析 (用 Windows API 描述,分析了QCoreApplication::exec()和QEventLoop::exec的源码)(比起新号槽,事件机制是更高级的抽象,拥有更多特性,比如 accept/ignore,filter,还是实现状态机等高级 API 的基础)
事件系统在 Qt 中扮演了十分重要的角色,不仅 GUI 的方方面面需要使用到事件系统,Signals/Slots 技术也离不开事件系统(多线程间).我们本文中暂且不描述 GUI 中的一些特殊情况,来说 ...
- Windows API 函数列表 附帮助手册
所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...
- Windows程序内部运行机制 转自http://www.cnblogs.com/zhili/p/WinMain.html
一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序 ...
- 深入浅出话VC++(1)——Windows程序内部运行机制
一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序 ...
- [转]Windows的窗口刷新机制
1.Windows的窗口刷新管理 窗口句柄(HWND)都是由操作系统内核管理的,系统内部有一个z-order序列,记录着当前窗口从屏幕底部(假象的从屏幕到眼睛的方向),到屏幕最高层的一个窗口句柄的排序 ...
- Windows API Finishing
input { font-size: 14px; height: 26px } td { border-style: none; border-color: inherit; border-width ...
- windows程序内部运行机制
Windows程序内部运行机制 2007-10-21 19:52 1010人阅读 评论(0) 收藏 举报 windowsvc++applicationcallbackwinapistructure W ...
- 第1章 Windows程序内部运行机制
参考: https://blog.csdn.net/u014162133/article/details/46573873 1.Windows API与Win32 SDK 操作系统提供了各种方便开发W ...
- DELPHI中的消息处理机制(三种消息处理方法的比较,如何截断消息)
DELPHI中的消息处理机制 Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpasca ...
随机推荐
- 服务器(Ubuntu)远程访问ipython notebook(服务器运行ipython notebook 本地浏览器访问)
准备工作 首先要安装 ipython 推荐直接 Anaconda 搞起(装在服务器). Anaconda 帮你集成N多python相关环境(包),省得你再手动咔咔一顿安装 服务器启动ipython n ...
- python-绘图matplotlib
<Python编程:从入门到实践>读书笔记 1.使用plot()绘制简单的折线图 import matplotlib.pyplot as plt va=[1,2,3,4,5] sq=[1, ...
- [设计模式]迭代子模式 Iterator
迭代子模式又叫做游标cursor模式,是对象的行为模式.迭代子模式可以顺序的访问一个聚集中的元素而不必暴露聚集的内部表象. 迭代子模式被广泛的应用在Java语言的API中的几个设计模式之一.在Java ...
- Hadoop2.0中单点故障解决方案总结---老董
Hadoop 1.0内核主要由两个分支组成:MapReduce和HDFS,众所周知,这两个系统的设计缺陷是单点故障,即MR的JobTracker和HDFS的NameNode两个核心服务均存在单点问题, ...
- PAT 天梯赛 L1-048. 矩阵A乘以B 【数学】
题目链接 https://www.patest.cn/contests/gplt/L1-048 题意 给出两个矩阵,先判断两个矩阵能不能相乘,如果可以,就输出相乘 结果,如果不行 则按格式输出erro ...
- PAT 天梯赛 L1-014. 简单题 【水】
题目链接 https://www.patest.cn/contests/gplt/L1-014 AC代码 #include <iostream> #include <cstdio&g ...
- Entity FrameWork Code First无法生成数据库 解决办法
我是控制台应用程序,没有connectionStrings,试了几个方法也都不可以. 这是别人的博客用其他方法. http://www.cnblogs.com/Gyoung/archive/2013/ ...
- 优秀 H5 案例收集 vol.3(不定期更新)
上期浏览:Vol.1 Vol.2 爱的不同定义,五笔连成爱http://news.163.com/special/fdh5_valentines/ 世界华语悬疑文学大赛—下一位悬疑大师,就是你!h ...
- javascript-实现简单瀑布流
直接上代码: <style> *{ margin:0; padding:0; } .waterfall_item{ border:solid 3px #ccc; box-shadow:1p ...
- POJ 1442 优先队列
题意:有一些ADD和GET操作.n次ADD操作,每次往序列中加入一个数,由ADD操作可知序列长度为1-n时序列的组成.GET操作输入一个序列长度,输出当前长度序列第i大的元素的值.i初始为0,每次GE ...