win32&mfc————win32消息机制(一)

简介: win32&mfc————win32消息机制(一)

前言


前面我们介绍了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():该函数的消息传送是排队的,也就是按照消息产生的顺序传送,依次执行。

用一张图来解释:


346522a6d90784992adb5b41b1eed842_8bd99b1876454a7bb358e4672b7a688d.png


代码演示:


-- 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.消息处理


我们在获取消息后,根据获得的消息就可以实现自己的需求,比如我们在获得某一个消息的时候,与之对应的操作就会产生。比如产生一个弹窗,或者出现一句话。等等。


f470388bd715317638538bcb00273f81_386fb509b80e4741bfaccf62cf6eff27.png


比如这里的操作就是我们在点击某一个选项后出现的。


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);  //消息处理
            }


相关文章
|
IDE 开发工具 Windows
QT应用编程: windows下QT调用COM组件
QT应用编程: windows下QT调用COM组件
910 0
QT应用编程: windows下QT调用COM组件
|
5月前
|
C++
MFC创建带窗口的DLL
MFC创建带窗口的DLL
118 0
|
Windows
win32&mfc————win32消息机制(二)
win32&mfc————win32消息机制(二)
175 0
|
存储 Linux C++
win32&mfc————win32菜单栏&库(二)
win32&mfc————win32菜单栏&库(二)
105 0
|
编译器 C++
win32&mfc————win32菜单栏&库(一)
win32&mfc————win32菜单栏&库(一)
117 0
|
编译器 C语言
QT应用编程: Window系统下QT5创建DLL动态库并完成调用
QT应用编程: Window系统下QT5创建DLL动态库并完成调用
388 0
QT应用编程: Window系统下QT5创建DLL动态库并完成调用
|
开发工具 C++ API
win32中使用MFC类库
在Project->Setting->General 中选Use MFC in a Shared DLL或者 Use MFC in static Library并把project->Setting->C/C++ 中的Use runing-time library 由Single-Threaded改为...
1325 0