Windows消息传递机制详解

 林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka

     Windows是一个消息(Message)驱动系统。Windows的消息提供了应用程序之间、应用程序与Windows系统之间进行通信的手段。应用程序想要实现的功能由消息来触发,并且靠对消息的响应和处理来完成。必须注意的是,消息并非是抢占性的,无论事件的缓急,总是按照到达的先后派对,依次处理(一些系统消息除外),这样可能使一些实时外部事件得不到及时处理。

      Windows的应用程序一般包含窗口(Window),它主要为用户提供一种可视化的交互方式,窗口是总是在某个线程(Thread)内创建的。Windows系统通过消息机制来管理交互,消息(Message)被发送,保存,处理,一个线程会维护自己的一套消息队列(Message Queue),以保持线程间的独占性。队列的特点无非是先进先出,这种机制可以实现一种异步的需求响应过程。

目录:

1、消息

2  、消息类型

3 、消息队列(Message Queues)

4 、队列消息(Queued Messages)和非队列消息(Non-Queued Messages)

5 、PostMessage(PostThreadMessage), SendMessage

6 、GetMessage, PeekMessage

7 、TranslateMessage, TranslateAccelerator

8、(消息死锁( Message Deadlocks)

9、BroadcastSystemMessage

10、消息的处理

11、MFC的消息映射

12、消息反射机制


1、消息

    消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉。一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向Windows发出一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变窗口尺寸、按下键盘上的一个键

都会使Windows发送一个消息给应用程序。

    消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,对于单击鼠标所产生的消息来

说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做MSG,MSG含有来自windows应用程序消息队列的消息信息,它在

Windows中声明如下: 
typedef struct tagMsg 

HWND hwnd;          // 接受该消息的窗口句柄 
UINT message;         // 消息常量标识符,也就是我们通常所说的消息号 
WPARAM wParam;     // 32位消息的特定附加信息,确切含义依赖于消息值 
LPARAM lParam;       // 32位消息的特定附加信息,确切含义依赖于消息值 
DWORD time;         // 消息创建时的时间 
POINT pt;             // 消息创建时的鼠标/光标在屏幕坐标系中的位置 
}MSG; 
    消息可以由系统或者应用程序产生。系统在发生输入事件时产生消息。举个例子, 当用户敲键, 移动鼠标或者单击控件。系统也
产生消息以响应由应用程序带来的变化, 比如应用程序改变系统字体,改变窗体大小。应用程序可以产生消息使窗体执行任务,或者与其他应用程序中的窗口通讯。

2、消息类型

1) 系统定义消息(System-Defined Messages)
        在SDK中事先定义好的消息,非用户定义的,其范围在[0x0000, 0x03ff]之间, 可以分为以下三类: 
1> 窗口消息(Windows Message)
       与窗口的内部运作有关,如创建窗口,绘制窗口,销毁窗口等。可以是一般的窗口,也可以是Dialog,控件等。 
如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL... 
2> 命令消息(Command Message)
        与处理用户请求有关, 如单击菜单项或工具栏或控件时, 就会产生命令消息。 
WM_COMMAND, LOWORD(wParam)表示菜单项,工具栏按钮或控件的ID。如果是控件, HIWORD(wParam)表示控件消息类型 
3> 控件通知(Notify Message)
        控件通知消息, 这是最灵活的消息格式, 其Message, wParam, lParam分别为:WM_NOTIFY, 控件ID,指向NMHDR的指针。NMHDR包含控件通知的内容, 可以任意扩展。 
2) 程序定义消息(Application-Defined Messages)
        用户自定义的消息, 对于其范围有如下规定: 
WM_USER: 0x0400-0x7FFF      (ex. WM_USER+10) 
WM_APP(winver> 4.0): 0x8000-0xBFFF (ex.WM_APP+4) 
RegisterWindowMessage: 0xC000-0xFFFF

3、消息队列(Message Queues)

 Windows中有两种类型的消息队列 
1) 系统消息队列(System Message Queue)
        这是一个系统唯一的Queue,设备驱动(mouse, keyboard)会把操作输入转化成消息存在系统队列中,然后系统会把此消息放到目标窗口所在的线程的消息队列(thread-specific message queue)中等待处理 
2) 线程消息队列(Thread-specific Message
  • 28
    点赞
  • 154
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值