Win32API 消息机制
Posted zzdoit
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Win32API 消息机制相关的知识,希望对你有一定的参考价值。
Win32API 消息机制
- windows平台下,什么是消息?
- 当系统通知窗口工作时,就采用消息的方式派发给窗口的窗口处理函数
- 消息组成的6大部件组合,缺一不可:
- 1 窗口句柄
- 每个win32的窗口程序,只要是有窗口,就不可能没有窗口句柄,因为创建之初就生成了句柄,有如小车要上路就强制要求有个“车牌”。
- 2 消息ID
- 微软给windows消息机制,设计1024个消息数字,这种数字的出现,就代表此种消息的出现。
- 3 消息的两个参数(附带信息)
- 任何一个消息都附带两个信息: 1 不同的消息,这两个附带的信息是不同的 2 一个用WPARAM 保存 ,另外一个用 LPARAM类型来保存。
- 4 消息产生的时间 (不关注,但不可缺少)
- 5 消息产生时的鼠标位置 (不关注,但不可缺少)
- 消息相关函数
- 1 GetMessage - 获取本进程的消息
BOOL GetMessage(
LPMSG lpMsg, //存放获取到的消息Buff
HWND hWnd, //窗口句柄
UINT wMsgFilterMin, //获取消息的最小ID 默认0
UINT wMsgFilterMax //获取消息的最大ID 默认0
); - LPMSG lpMsg, - 当获得消息后,将消息的参数存放到MSG结构中。
- HWND hWnd, - 获得hWnd所指定窗口的消息。
- UNIT wMsgFilterMin 和 UNIT wMsgFilterMax - 只能获得由它们指定的消息范围内的消息,如果都为0,表示没有范围。
- BOOL GetMessage(...) 这个函数的返回值非常重要
- while(GetMessage(...)){......} 返回0才能结束,然而能使得GetMessage函数返回0的消息只有一个:WM_QUIT 。
- PostQuitMessage(0); 预设了一个WM_QUIT消息。##助记:挖坑埋雷
- 2
TranslateMessage - 翻译消息。将探寻消息,翻译成字符消息。
BOOL TranslateMessage(
const MSG* lpMsg //要翻译的消息地址
); - 检查消息是不是按键的消息,不是按键消息,不做任何处理,继续执行。
- 3
DispatchMessage - 派发消息。
LONG DispatchMessage(
const MSG* lpmsg
); - DispatchMessage(&msg,NULL,NULL,NULL)函数派发消息,触发窗口处理函数,调用窗口处理函数。
- msg.hWnd --> 找到保存窗口数据的内存 ---> 比对"窗口名称"--->匹配窗口类 ---> 调用WndProc(msg.hWnd, msg.message, msg,wParam, msg.lParam); --->给了我们处理消息的机会,我们只处理我们关注的消息,其余的消息,让系统默认的函数DefWindowProc()处理。
以上是关于Win32API 消息机制的主要内容,如果未能解决你的问题,请参考以下文章