windows消息机制,窗口如何处理消息

一、windows消息机制

        消息用途

        应用程序与操作系统之间通信的一种方式。

        每当发生事件,如键盘按键、鼠标移动或系统事件时,操作系统都会生成相应的消息,并发送到一个特定的消息队列中,随后由应用程序的消息循环进行处理 。

        消息队列

        消息队列是每个创建了窗口的线程所拥有的,用于存储待处理消息的队列。这些消息不仅包括用户的操作动作,如鼠标点击或键盘输入,也包括系统发送的通知,如窗口重绘请求或系统关闭通知 。

        消息循环是线程通过循环机制从其消息队列中检索消息的过程,基本操作包括使用        

        GetMessage或PeekMessage检索消息

        TranslateMessage转换键盘输入

        DispatchMessage将消息派发给目标窗口的窗口过程函数 

        消息分类

        系统消息:涉及窗口生命周期管理,如WM_CLOSE和WM_QUIT等;

        硬件消息:反映用户与硬件的交互,如WM_KEYDOWN和WM_MOUSEMOVE等。

        自定义消息:从WM_USER(0x0400)开始定义 。

// 自定义消息
#define WM_MY_CUSTOM_MESSAGE (WM_USER + 1)

        消息函数

        在实现上,GetMessage、PeekMessage、SendMessage和PostMessage是Windows消息处理的核心接口。

        GetMessage用于从消息队列中检索消息,是阻塞性的;

        PeekMessage允许非阻塞地检查消息队列;

        SendMessage用于同步发送消息,调用方会等待消息被处理;

        PostMessage则用于异步发送消息,将消息放入队列后立即返回 。

二、窗口回调函数

  • 窗口回调函数(Window Procedure),是一个函数,它处理发送到窗口的所有消息。
  • 函数原型: 窗口过程遵循特定的函数原型,如下

    LRESULT CALLBACK WindowProcedure(
        HWND   hwnd,       // 窗口句柄
        UINT   message,    // 消息类型
        WPARAM wParam,     // 第一个消息参数
        LPARAM lParam      // 第二个消息参数
    );
  • 消息分发: 当消息产生时(如用户操作、系统事件等),Windows会将消息发送到目标窗口的消息队列。

  • 消息循环: Windows应用程序通过一个消息循环来不断检查和检索消息队列中的消息。消息循环通常使用GetMessageDispatchMessage函数实现。

    // MFC程序中的消息循环
    // 进入消息循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        // 分发消息
        DispatchMessage(&msg);
    }
  • 消息处理: 当GetMessage从消息队列中取出一个消息时,DispatchMessage会根据消息的类型调用相应的窗口过程来处理消息。

  • 自定义消息处理: 开发者可以在窗口过程中使用switch语句来区分不同类型的消息,并为每种消息编写特定的处理代码。

  • 默认消息处理: 如果窗口过程没有处理某个消息(例如,消息不是开发者感兴趣的类型),它通常会调用DefWindowProc,这是一个系统提供的默认窗口过程,用于执行默认的消息处理。

  • 消息类型: 消息可以是用户输入(如键盘和鼠标事件)、窗口管理事件(如大小调整、关闭)、自定义消息等。

  • 消息参数wParamlParam参数提供了消息的附加信息,其具体含义依赖于消息的类型。

  • 返回值: 窗口过程的返回值通常用于表示消息是否被成功处理,或者作为某些消息的结果。

一个简单的demo

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    switch (message) {
        case WM_PAINT:
            // 处理重绘窗口的逻辑
            break;
        case WM_CLOSE:
            // 处理关闭窗口的逻辑
            DestroyWindow(hwnd);
            break;
        case WM_DESTROY:
            // 处理窗口销毁的逻辑,如退出程序
            PostQuitMessage(0);
            break;
        default:
            // 对于未处理的消息,调用默认窗口过程
            return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0; // 返回值,具体含义依赖于消息类型
}

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值