Windows消息队列 UI线程,窗口以及消息处理方式总结

来源:互联网 发布:阮一峰javascript 编辑:程序博客网 时间:2024/06/17 09:07

 

windows消息处理机制是这样的:
  
首先Windows OS 把来自硬件(鼠标,键盘等消息)和来自应用程序的消息放到一个OS系统消息队列中去, 而应用程序需要有自己的消息队列,也就是线程消息队列,每一个线程有自己的消息队列,对于多线程的应用程序就有和线程数目相等的线程消息队列. windows消息队列把得到的消息发送到线程消息队列, 线程消息队列每次取出一条消息发送到指定窗口,不断循环直到程序退出.这个循环就是靠消息环

while(GetMessage() )

{  TranslateMessage();

DispatchMessage();  }

实现的.GetMessage()只是从线程消息中取出一条消息,DispatchMessage
则把取出的消息发送到目的窗口.如果收到WM_CLOSE消息则结束循环,发送postqiutmessage(0),处理WM_DESTROY销毁窗口

 

Windows消息队列 UI线程,窗口以及消息处理方式总结

 

1 Windows UI thread:

2 每个窗体是一个UI thread,还是只有一个UIthread所有的窗体都用这一个UI thread

3 Message queue: 每个窗体都有一个messagequeue,还是共用一个message queue

4 message处理:是同步还是异步。是每次处理一个消息等这个消息处理完后再处理另一个消息还是每次取一个不等这个消息处理完就处理下一个,也就是dispatchmessage什么时候返回?

    答案是要等这个消息处理函数处理完以后才返回,否则会造成消息处理的混乱

  

5 message的结构是什么:包含了窗体的handle,消息的类型等

  Winuser.h中有定义如下:
typedef struct tagMSG {
    HWND        hwnd;
    UINT        message;
    WPARAM      wParam;
    LPARAM      lParam;
    DWORD       time;
    POINT       pt;
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
    
其中的成员变量messageWM_SIZEWM_COMMANDWM_QUIT等等消息标识。
    hwnd
中是这个消息所在的窗口句柄。

 

6 Windows如何知道消息应该送到哪一个线程,

    这里我们要分为两种情况, 消息是不是队列消息, 比如在一个窗体空白处点击左键, 首先OS会根据当前的context来生成MSGMSG中会包括要发送到的窗口的Handle, 这就是一个队列消息, 首先OS会将这个消息放到OS的系统消息队列中, 而后OS会有专门的进程根据MSG中的窗口的Handle找到创建该窗口的线程,而后将该MSG送到该线程的消息队列,而后由该消息循环来处理这个消息, 最终由Dispatchmessage 函数来将这个消息送到相应的窗口处理函数。

  如果你在一个窗体上点击了一个button呢,消息的路径是怎样的呢?当你点击了一个button后,OS产生三个MSG。WM_LBUTTONDOWN和WM_LBUTTONUP,这两个消息的窗口Handle为button的handle。一个WM_command或者wm_notify消息,OS会将这个消息直接送给包含buttonwindow processdure来处理,而不会将这个送到消息队列。

原创粉丝点击