消息和消息处理之消息循环
来源:互联网 发布:spss软件最新版 编辑:程序博客网 时间:2024/05/17 09:31
在Win32编程中,消息循环是相当重要的一个概念,看似很难,但使用起来却是非常简单。在WinMain函数的最后,有下列代码:
while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) // 转换某些键盘消息 DispatchMessage (&msg)
// 将消息发送给窗口过程,这里是WndProc
}
Windows应用程序可以接收以各种形式输入的信息,这包括键盘、鼠标动作、计时器产生的消息,也可以是其他应用程序发来的消息等。Windows系统自动监控所有的输入设备,并将其消息放入该应用程序的消息队列中。
GetMessage函数就是用来从应用程序的消息队列中按照先进先出的原则将这些消息一个个地取出来,放进一个MSG结构中去。它的原型如下:
BOOL GetMessage( LPMSG lpMsg, // 指向一个MSG结构的指针,用来保存消息
HWND hWnd, // 指定哪个窗口的消息将被获取
UINT wMsgFilterMin, // 指定获取的主消息值的最小值
UINT wMsgFilterMax // 指定获取的主消息值的最大值
);
GetMessage函数用来将获取的消息复制到一个MSG结构中。如果队列中没有任何消息,该函数将一直空闲直到队列中又有消息时再返回。如果队列中已有消息,它将取出一个后返回。MSG结构包含Windows消息的完整信息,其定义如下:
typedef struct { HWND hwnd; // 消息发向的窗口的句柄
UINT message; // 主消息的标识值
WPARAM wParam; // 附消息值,其具体含义依赖于主消息值
LPARAM lParam; // 附消息值,其具体含义依赖于主消息值
DWORD time; // 消息放入消息队列中的时间
POINT pt; // 消息放入消息队列时的鼠标坐标
} MSG, *PMSG;
上述结构中的主消息表明了消息的类型,例如,是键盘消息还是鼠标消息等,附消息的含义则依赖于主消息值,例如,如果主消息是键盘消息,那么附消息中则存储了是键盘的哪个具体键的信息。
事实上,GetMessage函数还可以过滤消息,它的第二个参数是用来指定从哪个窗口的消息队列中获取消息,其他窗口的消息将被过滤掉。如果该参数为NULL,则GetMessage从该应用程序线程的所有窗口的消息队列中获取消息。第三个和第四个参数是用来过滤MSG结构中主消息值的,主消息值在wMsgFilterMin和wMsgFilterMax之外的消息将被过滤掉。如果这两个参数为0,则表示接收所有消息。
特别地,当且仅当GetMessage函数在获取到WM_QUIT消息后,将返回0值,于是程序退出消息循环。
TranslateMessage函数的作用是把虚拟键消息转换到字符消息,以满足键盘输入的需要。DispatchMessage函数所完成的工作是把当前的消息发送到对应的窗口过程中去。
- 消息和消息处理之消息循环
- 消息和消息处理之消息处理
- android应用消息处理机制分析之消息循环
- Windows OS 消息泵(消息循环处理)
- 3消息循环中的消息处理
- 3消息循环中的消息处理附图
- Windows OS 消息泵(消息循环处理)
- C++Windows编程之消息循环和消息结构
- WindowsSDK 之 消息循环
- 线程之--- 消息循环
- WebKit之消息循环
- 《Android系统学习》第十章:Android消息处理、消息循环和消息队列
- Wpf消息循环之消息传递
- freeDiameter源码阅读之消息队列和消息处理流程
- MFC消息循环和消息泵
- MFC消息循环和消息泵
- MFC消息循环和消息泵
- MFC消息循环和消息泵
- leetcode128. Longest Consecutive Sequence
- HDOJ 1213 How Many Tables 1232 畅通工程(并查集基础,水)
- 常用Java代码汇总
- vector容器中resize与reserve的区别
- 【面试题】剑指Offer-28-字符串的全排列
- 消息和消息处理之消息循环
- mac下 ndk_build: command not found
- cin和cout格式控制
- Pixhawk原生固件PX4之调节怠速
- leveldb源码剖析--编码
- 关于JAVA中String="abc"和String=new String("abc")的区别与联系
- struts2中struts.xml配置文件详解
- C++中的定时器-SetTimer
- kvm虚拟化