win32——消息循环 原理 函数 GetMessage PeekMessage TranslateMessage SendMessage PostMessage
//消息循环 MSG 结构体 typedef struct tagMSG { HWND hwnd; UINT message; //消息ID WPARAM wParam; LPARAM lParam; DWORD time; //时间(消息投递到消息队列的时间) POINT pt; //鼠标的当前位置 #ifdef _MAC DWORD lPrivate; #endif } MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG; //一、消息基本概念: 产生过程: 事件---- > 封装消息(MSG结构体)---- > 传递消息到队列---- > 消息响应(消息处理函数) 消息队列---- > GetMessage()---- > DispatchMessage()---- > winProc 消息分类: 系统消息:取值范围(0~0x03ff) 程序消息(自定义消息):取值范围(0x400 - 0x7ff) WM_USR + 100 (用户自定义) 消息队列: 系统消息队列:鼠标键盘。。。 程序消息队列: 队列消息:消息的发送和获取都在队列中 非队列消息:不需要存入队列,直接消息处理函数处理(WM_SIZE) //二、函数 //2.1.1 GetMessage //从消息队列中获得消息,并移除,无消息时,等待,,如果得到WM_QUIT消息返回的0,结束循环 //1.例子 GetMessage(&msg, NULL, 0, 0); //2.原型 BOOL WINAPI GetMessageW( _Out_ LPMSG lpMsg, _In_opt_ HWND hWnd, _In_ UINT wMsgFilterMin, _In_ UINT wMsgFilterMax); //3.过程 当前消息队列(有, 判断窗口句柄,消息ID范围,满足则从消息队列中删除,并winProc || 无,系统消息,有的话进入到消息队列) ---- > 检查窗口是否重绘(有,WM_PAINT) ---- > 查看定时器(有,WM_TIMER) ---- > 优化内存,优化资源 ---- > 等待。 //2.1.2 PeekMessage //从消息队列中获得消息,可选择是否移除,非堵塞,根据返回值,如果为false,则无消息 //1.例子 PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE); //2.原型 BOOL WINAPI PeekMessageW( _Out_ LPMSG lpMsg, _In_opt_ HWND hWnd, _In_ UINT wMsgFilterMin, _In_ UINT wMsgFilterMax, _In_ UINT wRemoveMsg); //PM_NOREMOVE || PM_REMOVE //2.2 TranslateMessage //大小写键盘翻译 //例子 TranslateMessage(&msg); //2.3.1 SendMessage //把消息发送到指定窗口,直接给消息处理函数,直到消息处理函数返回结束,堵塞函数(必须等消息处理完成) //1.例子 SendMessage(hWnd, WM_CLOSE, 0, 0); //WM_DESTROY 是关闭程序的 WM_CLOSE 是关闭窗口的 WM_QUIT 是关闭消息环的 //2.原型 LRESULT WINAPI SendMessageW( _In_ HWND hWnd, _In_ UINT Msg, //消息 _Pre_maybenull_ _Post_valid_ WPARAM wParam, _Pre_maybenull_ _Post_valid_ LPARAM lParam); //2.3.2 PostMessage //发送消息,发送到消息队列,不等待处理完成,非堵塞函数 //1.例子 PostMessage //2.原型 BOOL WINAPI PostMessageW( _In_opt_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam);
靠技术实力称霸,千面鬼手大人万岁!