首页 > 代码库 > Win32API 消息机制

Win32API 消息机制

Win32API 消息机制

    • windows平台下,什么是消息?
      • 当系统通知窗口工作时,就采用消息的方式派发给窗口的窗口处理函数
      • 消息组成的6大部件组合,缺一不可:
        • 1 窗口句柄
          • 每个win32的窗口程序,只要是有窗口,就不可能没有窗口句柄,因为创建之初就生成了句柄,有如小车要上路就强制要求有个“车牌”。
        • 2 消息ID
          • 微软给windows消息机制,设计1024个消息数字,这种数字的出现,就代表此种消息的出现。
        • 3 消息的两个参数(附带信息)
          • 任何一个消息都附带两个信息: 1 不同的消息,这两个附带的信息是不同的 2 一个用WPARAM 保存 ,另外一个用 LPARAM类型来保存。
        • 4 消息产生的时间 (不关注,但不可缺少)
        • 5 消息产生时的鼠标位置 (不关注,但不可缺少)
    • 消息相关函数
      • 1 GetMessage - 获取本进程的消息
        BOOL GetMessage(
        LPMSG lpMsg, //存放获取到的消息Buff
        HWND hWnd, //窗口句柄
        UINT wMsgFilterMin, //获取消息的最小ID 默认0
        UINT wMsgFilterMax //获取消息的最大ID 默认0
        );
        • LPMSG lpMsg, - 当获得消息后,将消息的参数存放到MSG结构中。
        • HWND hWnd, - 获得hWnd所指定窗口的消息。
        • UNIT wMsgFilterMin 和 UNIT wMsgFilterMax - 只能获得由它们指定的消息范围内的消息,如果都为0,表示没有范围。
        • BOOL GetMessage(...) 这个函数的返回值非常重要
          • while(GetMessage(...)){......} 返回0才能结束,然而能使得GetMessage函数返回0的消息只有一个:WM_QUIT 。
          • PostQuitMessage(0); 预设了一个WM_QUIT消息。##助记:挖坑埋雷
      • 2 TranslateMessage - 翻译消息。将探寻消息,翻译成字符消息。
        BOOL TranslateMessage(
        const MSG* lpMsg //要翻译的消息地址
        );
        • 检查消息是不是按键的消息,不是按键消息,不做任何处理,继续执行。
      • 3 DispatchMessage - 派发消息。
        LONG DispatchMessage(
        const MSG* lpmsg
        );
        • DispatchMessage(&msg,NULL,NULL,NULL)函数派发消息,触发窗口处理函数,调用窗口处理函数。
        • msg.hWnd --> 找到保存窗口数据的内存 ---> 比对"窗口名称"--->匹配窗口类 ---> 调用WndProc(msg.hWnd, msg.message, msg,wParam, msg.lParam); --->给了我们处理消息的机会,我们只处理我们关注的消息,其余的消息,让系统默认的函数DefWindowProc()处理。

Win32API 消息机制