消息的知识:
一、消息循环的阻塞
GetMessage-从系统获取消息,将消息从系统中移除,阻塞函数。当系统无消息时,会等候下一条消息。
多一句嘴,TranslateMessage消息只翻译键盘消息
PeekMessage-以查看的方式从系统获取消息,可以不将消息从系统移除,非阻塞函数。当系统无消息时,返回FALSE,继续执行后续代码。
//PeekMessage定义
BOOL PeekMessage(
LPMSG lpMsg, //message infomation
HWND hWnd, //handle to window
UINT wMsgFilterMin, //firstMessage
UINT wMsgFilterMax, //lastMessgae
UINT wRemoveMsg //移除标识 PM_REMOVE/PM_NOREMOVE
);
PeekMessage用法示例:(最后的WriteConsole函数真的是闲的蛋疼)
while(1)
{
if(PeekMessage(&msg,hwnd,0,0,PM_NOREMOVE))
{
//消息队列中有消息
if(GetMessage(&msg,hwnd,0,0))
{
//有消息时处理消息
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
//如果获得消息是0,退出消息循环
return 0;
}
}
else
{
//消息队列中没有消息,可以利用这时候的资源进行别的操作处理
WriteConsole(hOutPut,TEXT("空闲\n"),lstrlen(TEXT("空闲\n")),NULL,NULL);
}
}
二、发送消息
SendMessage-发送消息,会等候消息处理的结果。
PostMessage-投递消息,消息发出后立即返回,不等候消息处理。
SendMessage/Postmesage函数定义
BOOL SendMessage/PostMessage(
HWND hWnd, //消息发送的目的窗口
UINT Msg, //消息ID
WPARAM wParam, //消息参数
LPARAM lParam //消息参数
);
PostQuitMessage也是投递消息,只不过投递的是退出消息
自主发送退出消息WM_QUIT消息给窗口
case WM_DESTROY:
//PostQuitMessage(0);
PostMessage(hwnd,WM_QUIT,0,0);
//SendMessage(hwnd,WM_QUIT,0,0);
break;
系统消息-ID范围0~0x03FF(1024个消息)
由系统定义好的消息,可以在程序中直接使用
用户自定义消息-ID范围0x0400-0x7FFF(31743)
由用户自定义,满足用户自己的需求。由用户自已发送消息,并响应处理。
自定义消息宏:WM_USER 0x400
//1.定义自定义消息
#define WM_ZCMMSG WM_USER+0x01
//2.发送自定义消息
PostMessage(hwnd,WM_ZCMMSG,100,200);
SendMessage(hwnd,WM_ZCMMSG,200,300);
//3.处理消息(在消息处理函数中)
void OnZcmMessage