一、Windows的消息概念
1.消息组成:
- 窗口句柄
- 消息ID
- 消息的两个参数(两个附带信息)
- 消息产生的时间
- 消息产生时鼠标位置
typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG
2.消息的作用
当系统通知窗口工作时,就采用消息的方式派发给窗口
二、消息循环
//消息循环 MSG nMsg = { 0 }; while (GetMessage(&nMsg, NULL, 0, 0)) { TranslateMessage(&nMsg);//将虚拟消息转换为字符消息 DispatchMessage(&nMsg);//将消息分发给窗口处理函数 }
1.GetMessage():获取本进程的消息
WINUSERAPI BOOL WINAPI GetMessageA( _Out_ LPMSG lpMsg,//存放获取到的消息BUFF _In_opt_ HWND hWnd,//窗口句柄 _In_ UINT wMsgFilterMin,//获取消息的最小ID _In_ UINT wMsgFilterMax//获取消息的最大ID
);
lpMsg:当获取到消息后,将消息的参数存放到MSG结构中
hWnd:获取到hWnd所指定窗口的消息
wMsgFilterMin和wMsgFilterMax:只能获取到由它们指定的消息范围内的消息,如果都为0,表示没有范围
2.TranslateMessage():翻译消息,将按键消息翻译成字符消息
BOOL WINAPI TranslateMessage( _In_ CONST MSG *lpMsg //要翻译的消息地址 );
检查消息是否有按键消息,如果不是按键消息,不做任何处理,继续执行
3.DispatchMessage()函数执行流程:
DispatchMessage(&nMsg) { nMsg.hwnd --> 通过窗口句柄找到保存窗口数据的内存 -->然后找到窗口消息处理函数 WndProc(nMsg.hWnd, nMsg.msgID, nMsg.wParam, nMsg.lParam) { //执行消息处理函数 } }
每个窗口都必须具有窗口处理函数:
LRESULT CALLBACK
WindProc(
HWND hWnd, //窗口句柄
UINT msgID, //消息ID
WPARAM wParam, //消息参数
LPARAM lParam //消息参数
);
当系统通知窗口时,会调用窗口处理函数,同时将消息ID和消息参数传递给窗口处理函数,在窗口处理函数中,不处理的消息,使用缺省窗口处理函数,例如:DefWindowProc
标签:窗口,hWnd,编程,ID,Win32,nMsg,消息,机制,处理函数 From: https://www.cnblogs.com/TechNomad/p/17683666.html