一、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