消息与消息队列二(译自MSDN的About Message and Message Queue)

来源:互联网 发布:今古传奇故事月末 知乎 编辑:程序博客网 时间:2024/05/22 07:29
  1. /*
  2.     窗口过程
  3.        窗口过程是一个函数,它会处理所有发送至与其关联的窗口的消息,每个窗口类都有一个
  4.        窗口过程,同一窗口类的所有窗口共用一个窗口过程。
  5.        
  6.        系统以参数的方式将消息发送到窗口过程,然后窗口过程会根据消息采取合适的操作,它会
  7.        检查消息的标识符,处理时会参考消息里的附加信息。
  8.        
  9.        窗口过程并不会处理其接收到的每一个消息,如果它处理不了接收到的消息,它会将些消息
  10.        返回给系统以寻求默认的处理,完成默认处理的函数是DefWindowProc,处理完成之后会
  11.        返回默认的处理结果,接收消息的窗口过程会将此结果看作自己处理后的结果并返回之。
  12.        多数的窗口过程只处理少数的消息,大部分的消息都由默认的窗口过程来处理。
  13.        
  14.        因为一个窗口过程可以处理一个窗口类的所有窗口,所以为了明确窗口类的哪个窗口会受到
  15.        消息的影响,就需要窗口句柄的帮助。
  16.     消息过滤
  17.         通过函数GetMessage和PeekMessage可以有选择性的从消息队列中提取消息,过滤
  18.         器是一个区间内的消息标识符或者窗口句柄,或者二者都指定。当消息延迟到达消息
  19.         队列后,程序可以通过这种方式检查消息的存在性。同样如果程序想优先处理硬件
  20.         消息时,这一点也很有用。
  21.         WM_KEYFIRST和WM_KEYLAST可以作为提取所有键盘消息的过滤器。WM_MOUSEFIRST
  22.         WM_MOUSELAST同样可以作为提取所有光标消息的过滤器。
  23.         使用消息过滤最需要注意的一点是要确保要提取的消息类型有机会被投掷到消息队列
  24.         中,如果要过滤的消息不能被投掷到消息队列中时,有时会影响整个程序的性能。
  25.         比如GetMessage是取到消息之后才返回,而如果要提取的消息一直不存在,则会出现
  26.         死循环的现象。
  27.     投掷和发送消息
  28.         每一个应用程序都可以投掷或发送消息,投掷消息是将消息复制到消息队列中,而
  29.         发送消息则是将消息直接作为参数发送给窗口过程。PostMessage可以实现投掷
  30.         消息的功能,SendMessage,BroadcastSystemMessage,SendMessageCallback,
  31.         SendMessageTimeOut,SendNotifyMessage,SendDlgItemMessage可以实现发送
  32.         消息的功能。
  33.         投掷消息
  34.             投掷消息通常用于通知一个窗口去完成指定的任务。PostMessage会构造一个
  35.             MSG结构然后将其复制到消息队列中。然后程序的消息循环最终会取得这个消息
  36.             然后将其发送给指定的窗口去处理。
  37.             投掷消息时,程序可以不用指定窗口句柄,如果投掷时指定窗口句柄为空,则
  38.             消息会被投掷到当前线程的消息队列中,因为没有指定窗口句柄,所以程序的
  39.             消息循环必须处理这个消息,通过这种方式可以实现创建一个消息而应用于整个
  40.             程序而不是特定的窗口。
  41.             另外如果想向系统里所有的顶级窗口发送,可以将窗口句柄设置为HWND_TOPMOST。
  42.             编程过程中一个常见的错误认识是认为PostMessage总能成功地投掷出一个消息,
  43.             这是不对的,比如当消息队列满的时候。所以在使用这个函数的时间要检查
  44.             这的返回值,如果返回值说投掷失败,我们就需要再进行投掷操作。
  45.         发送消息
  46.             发送消息通常用于通知窗口过程立即去执行一个任务。SendMessage将消息发送
  47.             到相关的窗口过程,此函数会等到消息被处理之后再返回,子窗口与父窗口通常
  48.             以就发送消息的方式进行通信,
  49.             SendMessageCallback区别于SendMessage的地方在于它发送完消息之后会立即
  50.             返回,消息被处理完之后,系统会调用相应的回调函数。   
  51.             通过函数InSendMessage和InSendMessageEx,窗口过程可以检查它处理的消息
  52.             是否来自另外一个线程,消息源会决定消息是否处理的时候,这两个函数就有了
  53.             用场。
  54. */
原创粉丝点击