Win32编程之消息机制(二)

发布时间 2023-09-06 23:12:02作者: TechNomad

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