win32——消息循环 原理 函数 GetMessage PeekMessage TranslateMessage SendMessage PostMessage

Posted 千面鬼手大人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);

 

以上是关于win32——消息循环 原理 函数 GetMessage PeekMessage TranslateMessage SendMessage PostMessage的主要内容,如果未能解决你的问题,请参考以下文章

windows程序消息循环机制

怎么用win32的消息处理函数实现快捷键的功能

windows消息处理机制的消息内容

win32消息循环

Win32:是啥让我的消息循环在该示例中无法正常工作?

119.WIN32窗口原理