前言
前面我们介绍了win32程序框架,并写了一个程序,而这个程序用的就是消息机制。消息机制作为win32程序开发中重要的部分,下面将通过一些案例来认识消息机制。
一、消息机制是什么
消息机制,顾名思义,从字面意思上来理解,就是对消息的处理方式。我们在使用手机的时候,打开一个软件,我们在点击某一个选项的时候,系统就会获取到你点击的信息,然后传送到处理中心,当然,仅仅只是获取你息还不能够完成操作,还需要消息的传送,然后做出与之对应的操作。这也就是
为什么我们点击一个选项的时候,不会出现错误打开的情况。当然,这只是简单的分析,手机的运行不仅仅是如此的简单。
二、Windows消息机制
windows消息机制:产生消息,传递消息,处理消息;
1.产生消息
①.GetMessage(); 只要不是退出消息,返回值就为true;
②.PeekMessage();只要是有消息参数,就返回true,否则返回false;
代码示例:
-- GetMessage()函数; //参数设置: BOOL GetMessage( LPMSG 【LPMSG】, //具有消息结构的地址 HWND 【的hWnd】, //窗口的句柄 UINT 【wMsgFilterMin】, //第一个消息 UINT 【wMsgFilterMax】 // last message ); while (GetMessage(&msg, nullptr, 0, 0)) //当获得的消息为真时,就返回true; { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) //判断是不是快捷键; { TranslateMessage(&msg); DispatchMessage(&msg); } }
-- PeekMessage()
//参数设置 BOOL PeekMessage( LPMSG 【LPMSG】, //指向消息结构的指针 HWND 【的hWnd】, //处理窗口 UINT 【wMsgFilterMin】, //第一个消息 UINT 【wMsgFilterMax】, // last message UINT 【wRemoveMsg】 //删除标志 ); MSG msg; //使用peekMessage() ZeroMemory(&msg, sizeof(msg)); //初始化; /* VOID ZeroMemory( PVOID 【目的地】, //填写零的块地址 DWORD 【长度】 //以块的大小(以字节为单位)填充零 ); */ while (msg.message != WM_QUIT) //如果不是退出的消息,就执行消息循环; { if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) //只要鼠标移动,就执行; PM_NOEMOVE是不移动; { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) //判断是不是快捷键; { TranslateMessage(&msg); DispatchMessage(&msg); } } }
可能有很多人很疑惑,同样是获取消息,那么为什么两个函数的使用方法会不一样,这个就是由于他们的特性决定的,GetMessage()函数,只要得到的不是退出的消息,就会返回true,而PeekMessage()函数只要有消息参数就返回true。如果在while中直接使用PeekMessage)函数,那么窗口就会直接闪退,你来不及操作,系统会认为你没有给他消息,于是就返回了false,也就会闪退;
由于他们的特性决定,在软件开发中一般使用的是GetMessage(),而在游戏开发中就是用的是PekMessage();
2.消息传递
SendMessage():该函数的消息传送是插队的,也就是说系统会将现在获取的消息优先执行;
PostMessage():该函数的消息传送是排队的,也就是按照消息产生的顺序传送,依次执行。
用一张图来解释:
代码演示:
-- SendMessage() //参数设置 LRESULT SendMessage( HWND 【的hWnd】, //目标窗口的句柄 UINT 【消息】, //要发送的消息 WPARAM 【wParam中】, //第一个消息参数 LPARAM 【lParam的】 //第二个消息参数 ); HWND hwnd = FindWindowA(0, "我的Android手机"); //查找窗口; for (i = 0; i < 10; i++) { SendMessage(hwnd, WM_PASTE, 0, 0); SendMessage(hwnd, WM_KEYDOWN, VK_RETURN, 0); } -- PostMessage(): //参数设置 BOOL PostMessage( HWND 【的hWnd】, //目标窗口的句柄 UINT 【消息】, //要发帖 WPARAM 【wParam中】, //第一个消息参数 LPARAM 【lParam的】 //第二个消息参数 ); HWND hwnd = FindWindowA(0, "我的Android手机"); //查找窗口; for (i = 0; i < 10; i++) { PostMessage(hwnd, WM_PASTE, 0, 0); PostMessage(hwnd, WM_KEYDOWN, VK_RETURN, 0); }
3.消息处理
我们在获取消息后,根据获得的消息就可以实现自己的需求,比如我们在获得某一个消息的时候,与之对应的操作就会产生。比如产生一个弹窗,或者出现一句话。等等。
比如这里的操作就是我们在点击某一个选项后出现的。
case ID_32774: { int i = 0; HWND hwnd = FindWindowA(0, "我的Android手机"); //查找窗口; for (i = 0; i < 10; i++) { PostMessage(hwnd, WM_PASTE, 0, 0); PostMessage(hwnd, WM_KEYDOWN, VK_RETURN, 0); } MessageBox(hwnd,_T("消息轰炸开始"),_T("提示"),0); //消息处理 }