Windows API的消息处理机制

  上个学期找实习失利,让我觉得自己基础打得不够牢固,所以在华为实习的这三个月里,每天下班都在复习理论课的知识,顺便刷了一个月的 LeetCode。本来以为找工作是势在必得了,结果这个学期秋季校招的坑爹经历导致现在还没有拿到一家公司的 offer。华为实习一结束,回学校的第二天就去参加了 360 在广州的笔试,进了面试以后却又喜闻乐见地一面就被干掉了。再加上之前 milo yip 大大对我提的建议,思来想去,感觉还是自己的简历不够拿得出手。现在开始都没剩下几家想进的公司了,为了不失业只能提早为明年的春招做准备了 T_T。

  昨天在京东买的《游戏引擎架构》送到了,大致翻阅了一遍后,我便决定开始编写自己的游戏引擎了。2014年10月20日,Shit Like Game Engine 项目正式宣布启动!

  第一天,我主要对要实现的模块进行了初步构思,在 github 上建立了资源仓库。

  今天是第二天,我重温了一下 Ogre 和自己原来做的游戏的源代码,然后决定从渲染窗口开始写起,要建立窗口就不得不考虑窗口类如何对消息进行处理,于是查阅了一下 Windows API 消息处理的资料,现在将自己的理解整理记录一下。



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. 消息循环处理的代码示例:

// Main message loop
MSG msg = { 0 };
while (WM_QUIT != msg.message) {
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))   {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    else   {
        Sleep(20);
        // DoSomething
    }
}


  接下来一段时间的计划,应该是每天早上起床先刷几道 LeetCode 的算法题,下午和晚上编写自己的游戏引擎,并适时地整理一下学习的成果。

  祝未来的自己好运。。。_(:3> L)_

时间: 2024-10-08 10:24:15

Windows API的消息处理机制的相关文章

Windows应用程序的消息处理机制

(1)操作系统接收到应用程序的窗口消息,将消息投递到该应用程序的消息队列中. (2)应用程序在消息循环中调用GetMessage函数从消息队列中取出一条一条的消息. 取出消息后,应用程序可以对消息进行一些预处理,例如,放弃对某些消息的响应,或者调用TranslateMessage产生新的消息. (3)应用程序调用DispatchMessage,将消息回传给操作系统. 消息是由MSG结构体对象来表示的,其中就包含了接收消息的窗口的句柄.因此,DispatchMessage函数总能进行正确的传递.

Windows API 编程学习记录&lt;三&gt;

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,

Windows API 大全

常用Windows API1. API之网络函数WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接WNetCancelConnection2 结束一个网络连接WNetCloseEnum 结束一次枚举操作WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDis

Windows程序内部运行机制

Windows程序内部运行机制 一.        API与SDK Windows操作系统提供了各种各样的函数,以方便我们开发Windows应用程序,这些函数是Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称为API函数.我们在编写Windows程序时所说的API函数,就是指系统提供的函数,所有主要的Windows函数都在Windows.h头文件中进行了说明. SDK的全称是Software Development Kit

[转]Windows的窗口刷新机制

1.Windows的窗口刷新管理 窗口句柄(HWND)都是由操作系统内核管理的,系统内部有一个z-order序列,记录着当前窗口从屏幕底部(假象的从屏幕到眼睛的方向),到屏幕最高层的一个窗口句柄的排序,这个排序不关注父窗口还是子窗口. 当任意一个窗口接收到WM_PAINT消息产生重绘,更新区域绘制完成以后,就搜索它的前面的一个窗口,如果此窗口的范围和更新区域有交集,就向这个窗口发送WM_PAINT消息,周而复始,直到执行到顶层窗口.才算完成. 1.1 父子窗口间的刷新管理 对于一个对话框(主窗口

Windows程序内部运行机制 转自http://www.cnblogs.com/zhili/p/WinMain.html

一.引言 要想熟练掌握Windows应用程序的开发,首先需要理解Windows平台下程序运行的内部机制,然而在.NET平台下,创建一个Windows桌面程序,只需要简单地选择Windows窗体应用程序就可以了,微软帮我们做了非常好的封装,以至于对于很多.NET开发人员至今也不清楚Windows 平台下程序运行的内部机制,所以本专题将深入剖析下Windows 程序的内部运行机制. 二.Windows平台下几个基础概念 有朋友会问,理解了程序运行的内部机制有什么用,因为在我们实际开发中用得微软提供的

DELPHI中的消息处理机制

DELPHI中的消息处理机制 Delphi是Borland公司提供的一种全新的WINDOWS编程开发工具.由于它采用了具有弹性的和可重用的面向对象Pascal(object-orientedpascal)语言,并有强大的数据库引擎(BDE),快速的代码编译器,同时又提供了众多出色的构件.受到广大编程人员的青睐.在众多的编程语言(如VB,PowerBuilder,Powerpoint等)中脱颖而出.其中一个DELPHI强于其他编程语言(如VB4.0)的地方就是在DELPHI中可自定义消息,并可直接

Android消息处理机制

文章出处:http://www.cnblogs.com/qingblog/archive/2012/06/27/2566021.html Google参考了Windows的消息处理机制,在Android系统中实现了一套类似的消息处理机制.学习Android的消息处理机制,有几个概念(类)必须了解: 1.       Message 消息,理解为线程间通讯的数据单元.例如后台线程在处理数据完毕后需要更新UI,则可发送一条包含更新信息的Message给UI线程. 2.       Message Q

Windows API参考大全新编

书名:新编Windows API参考大全 作者:本书编写组 页数:981页 开数:16开 字数:2392千字 出版日期:2000年4月第二次印刷 出版社:电子工业出版社 书号:ISBN 7-5053-5777-8 定价:98.00元 内容简介 作为Microsoft 32位平台的应用程序编程接口,Win32 API是从事Windows应用程序开发所必备的.本书首先对Win32 API函数做完整的概述:然后收录五大类函数:窗口管理.图形设备接口.系统服务.国际特性以及网络服务:在附录部分,讲解如何