一、消息的获取
1、GetMessage:从系统获取消息,将消息从系统中移除,阻塞函数。当系统无消息时,GetMessage会等候下一条消息。
2、PeekMessage - 以查看的方式从系统获取消息,可以不将消息从系统移除,非阻塞函数。当系统无消息时,返回FALSE,继续执行后续代码。
BOOL PeekMessage( LPMSG lpMsg, // 消息信息 HWND hWnd, // 消息句柄 UINT wMsgFilterMin, // 消息范围 UINT wMsgFilterMax, // 消息范围 UINT wRemoveMsg //移除标识 PM_REMOVE / PM_NOREMOVE );
3、相关代码
void Message() { MSG nMsg = { 0 }; /*while (GetMessage(&nMsg, NULL, 0, 0)) { TranslateMessage(&nMsg); DispatchMessage(&nMsg); }*/ while (true) { if (PeekMessage(&nMsg,NULL,0,0,PM_NOREMOVE)) { //有消息 if (GetMessage(&nMsg, NULL, 0, 0)) { //不是WM_QUIT TranslateMessage(&nMsg); DispatchMessage(&nMsg); } else {//是WM_QUIT return; } ; }//没有消息 else { //空闲处理 WriteConsole(g_接受句柄, L"哎呦", 6, NULL, NULL);; } } }
二、消息的发送
1、SendMessage:发送消息,会等候消息处理的结果。
2、PostMessage:投递消息,消息发出后立刻返回,不等候消息执行结果。
WM_QUIT用到的就是这个
BOOL SendMessage / PostMessage( HWND hWnd, //消息发送的目的窗口 UINT Msg, //消息ID WPARAM wParam, //消息参数 LPARAM lParam //消息参数 );
三、消息的分类
1、系统消息:ID范围 0 - 0x03FF,由系统定义好的消息,可以在程序中直接使用。
2、 用户自定义消息:ID范围 0x0400 - 0x7FFF,由用户自己定义,满足用户自己的需求。由用户自己发出消息,并响应处理,自定义消息可以任何位置发送
自定义消息宏:WM_USER
#define WM_MYMESSAGE WM_USER+n
3、应用程序消息 - ID范围 0x8000 - 0xBFFF,程序之间通讯时使用的消息。,应用程序消息宏:WM_APP
4、系统注册消息 - ID范围 0xC000 - 0xFFFF,在系统注册并生成相应消息,然后可以在各个程序中使用这个消息。
5、相关代码
//定义消息宏 #define WM_MYMESSAGE WM_USER+1001 //发送消息 SendMessage(hWnd, WM_MYMESSAGE, 100, 200);//窗口之前就出来 //PostMessage(hWnd, WM_MYMESSAGE, 100, 200);//窗口之后才出来 //消息处理内容 void 自定义消息(HWND hWnd,WPARAM wParam,LPARAM lPaerm) { wchar_t str[256] = { 0 }; swprintf_s(str, L"自定义消息被处理了:%d", lPaerm); MessageBox(hWnd, str, L"哎呦", MB_OK); } case WM_MYMESSAGE: 自定义消息(hWnd, wParam, lParam); break;
6、运行结果