Windows核心编程06-Windows的消息循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows核心编程06-Windows的消息循环相关的知识,希望对你有一定的参考价值。

Windows的消息机制

  程序的执行机制

    过程驱动-程序的执行过程是按照预定好的顺序执行

    事件驱动-程序的执行是无序,用户根据需要随机触发相应的事件

  Win32窗口程序就是采用时间驱动方式执行,也就是消息机制

  什么是消息

    当系统通知窗口工作时,就采用消息的方式派发(DispatchMessage来派发)给窗口的自定义的处理函数函数WNDCLASSEX.lpfnWndProc

    消息组成:

      窗口句柄

      消息ID

      消息的两个参数 如鼠标单击,两个参数如下:

        消息产生的时间

        消息产生的鼠标位置

  窗口处理函数和消息

    每个窗口都必须具有窗口处理函数

    回调函数:自己定义一个函数,自己没调用给操作系统调用

LRESULT CALLBACK WindowProc(      
    HWND hwnd,  //窗口句柄
    UINT uMsg,  //消息ID
    WPARAM wParam, //消息参数
    LPARAM lParam //消息参数
);

    当系统通知窗口时,会调用窗口处理函数同时将消息ID和消息参数传递给窗口处理函数

    在窗口处理函数中,不处理的消息,使用缺省窗口处理函数 ,例如 DefWindowsProc

  消息相关函数

    1 GetMessage-获取消息,只能抓取本进程的消息      

BOOL GetMessage(      

    LPMSG lpMsg, //存放获取到的消息BUFF     HWND hWnd, //窗口句柄,抓取哪个窗口的消息,如果为空抓取本进程所有消息     UINT wMsgFilterMin, //获取消息的最小ID     UINT wMsgFilterMax //获取消息的最大ID );
  lpMsg - 当获取到消息后,将消息的参数存放在MSG结构中
  hWnd - 获取到hWnd所指定窗口的消息
  wMsgFilterMin和wMsgFilterMax - 只能获取到由它们指定消息范围内的消息,如果都为0,表示没有范围 通过现象发现 PostQuitMessage可以使GetMessage返回0
以下是MSDN的解释:
GetMessage返回值:

If the function retrieves a message other than WM_QUIT, the return value is nonzero.

If the function retrieves the WM_QUIT message, the return value is zero.

PostQuitMessage Function


The PostQuitMessage function indicates to the system that a thread has made a request to terminate (quit). It is typically used in response to a WM_DESTROY message.

Syntax

void PostQuitMessage(      

    int nExitCode );

Parameters

nExitCode
[in] Specifies an application exit code. This value is used as the wParam parameter of the WM_QUIT message.

2 TranslateMessage - 翻译消息。将按键消息,翻译成字符消息。

  BOOL TranslateMessage(

    CONST MSG *lpMsg //要翻译的消息地址

  );

  检查消息是否按键的消息,如果不是按键消息,不做任何处理,继续执行。

3 DispatchMessage - 派发消息。将消息派发到该消息所属窗口的窗口处理函数上

  LRESULT DispathMessage(

    CONST MSG *lpmsg // 要派发的消息

  );

以上是关于Windows核心编程06-Windows的消息循环的主要内容,如果未能解决你的问题,请参考以下文章

回炉重造之重读Windows核心编程-026- 窗口消息

Windows核心编程03-编写窗口程序的步骤

Windows核心编程

Windows核心编程

Windows核心编程

C语言实现双向非循环链表的清空