`
bluethink
  • 浏览: 96837 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

消息驱动机制

 
阅读更多

“消息”是windows运行机制中一个基本而又重要的概念。消息是一个报告事件发生的通知,消息驱动是围绕消息的产生与处理展开的,并依靠消息循环机制来实现。


从程序设计的观点看,某条消息可被视为某个事件的发生,比如点击鼠标。事件即可以由用户引发,也可以由应用程序产生,当然Windows本身也能发出消息。Windows应用程序的消息来源有4种:输入消息,控制消息,系统消息,用户消息。

  Windows是一个多任务操作系统,所以没有哪一个程序能够独占系统的资源,资源都是由Windows统一管理的。那么某个程序是如何获得用户的信息呢?事实上,Windows在时刻监视着用户的每个举动,并分析用户的动作与哪一个程序相关,然后将动作以消息的形式发送给当前的应用程序。相反,应用程序也在时时等着消息的到来,一旦发现它的消息队列中有未处理的信息,就获取并分析该消息,并根据消息所包含的内容采取适当的动作来响应。这里我们引出另一个概念“消息驱动”。比如当你单击file菜单的时候,首先这个动作被windows所捕获,而不是应用程序。经分析windows知道该动作该由哪个应用程序处理,然后windows就发送WM_COMMAND消息给该应用程序,它告诉应用程序,你单击了file菜单。应用程序得知这一消息后,便采取相应的动作来响应它,进行“消息处理”。Windows为每个线程维护了相应的消息队列,应用程序的任务就是不停地从特定的消息队列中获取消息、分析消息并处理消息,直到消息(WM_QUIT)为止。这个过程的程序结构称为“消息循环”。


消息传送


发送消息

  发送一个消息时,系统直接调用窗口进程。通信是即时的。直到窗口进程为调用函数返回一个结果后,应用程序才能继续。

寄送消息

  寄送一个消息时,系统把消息发送到拥有该窗口的应用程序消息队列中。消息队列是系统定义的一个内存块,用于临时存储消息,或是把消息直接发给窗口过程。每个窗口维护自己的消息队列,从中取出消息,利用窗口函数进行处理。一有空闲,应用程序就搜索消息队列,并在消息队列中处理消息,即从队列中删除他们。调用函数发送消息后就立即返回,但结果只是表示消息寄送成功与否,而不表示被调用窗口进程的结果。通常鼠标和键盘消息是寄送的。

消息处理



  Windows程序在处理消息时使用了“回调函数”的特殊函数。这个函数由应用程序定义,但并不由应用程序来调用,而是共操作系统或者其子系统来调用的。这种调用通常在某一事件发生,或者在窗口或字体被枚举时发生。


Windows对消息驱动机制的支持


基本模块

  Windows操作系统包括3个内核基本模块:

  GDI:负责在屏幕上绘制象素、打印硬考贝输出,绘制用户界面

  KERNEL:支持与操作系统密切相关的功能。如进程加载,系统调用

  USER:为所有的用户界面对象提供支持,它用于接收和管理所有输入消息、系统消息,并把他们发给相应的窗口的消息队列。

  上述GDI、KERNEL和USESR模块中的库函数可被应用程序调用,也可被其他程序模块调用。Windows把包含库函数的模块称为EXPORT,在WINDOWS提供的一种新的EXE文件中有一个入口表用于指明模块内每个输出函数的地址。

应用程序

  从应用程序方面,用到的库函数被认为是IMPORT函数。应用程序对一个入口函数发出的远程调用可用不同的重定位表来确定。几乎所有的应用程序都至少包含一个入口库函数或者称为被外部调用的函数。该windows库函数一般来自某个程序模块,用于从WINDOWS接收消息,该函数的使用标志必须是EXPORT,这才能使WINDOWS允许它被一个外部模块正常调用。


分享到:
评论

相关推荐

    MFC的消息机制的实现原理和消息处理的过程

    MFC的消息机制的实现原理和消息处理的过程 对于MFC初学者可以很好了解其内部的运行机制 很好的资源

    如何理解VC编程的windows消息处理机制

    包含个人工作日志,对初学者正确理解windows消息机制很有帮助

    Win32编程 消息驱动

    这种消息驱动机制,有点像银行的柜台业务:早上八点,银行开门(Windows应用程序开始运行),每个营业员(Windwows线程)回到自己的柜台开始办公。如果有顾客来办理相关业务(相当于Windows消息),那么对应的业务员...

    Visual C++模态对话框消息处理机制的分析

    摘要:消息驱动机制是Windows操作系统的根本,模态对话框消息处理又是不同于一般消息处理的特殊形式。通过分析这种消息机制的原理,可用来处理类似的程序设计要求。  在Windows操作系统中,面向用户的GUI基本上可...

    树懒_day19_事件驱动机制_高级UI_消息提示机制

    移动开发小白树懒,在努力的学习android基础.事件驱动机制_高级UI_消息提示机制 为将来打下扎实的基础

    vc++ 线程同步与异步套接字编程实例

    vc++ 线程同步与异步套接字编程实例,Windows套接字在两种模式下执行I/O操作... Windows Sockets为了支持Windows消息驱动机制,使应用程序开发者能够方便地处理网络通信,它对网络事件采用了基于消息的异步存取策略。

    SOCKET类的设计和实现

    它在Berkeley接口函数的基础之上,还增加了基于消息驱动机制的Windows扩展函数。Winscok1.1只支持TCP/IP网络,WinSock2.0增加了对更多协议的支持。这里,讨论TCP/IP网络上的API。 Socket接口包括三类函数:

    GDI++SDK参考 中文 高清PDF

    Microsoft Windows GDI+是为C/C++开发者提供的一个基于类的应用程序编程接口(API)。它使得程序可以同时在视频显示器和打印机上使用图形和格式化文本。...需要精通Windows图形用户接口和消息驱动机制。

    内核驱动程序和用户应用程序的消息通讯机制.txt

    内核驱动程序和用户应用程序的消息通讯机制.txt

    GDI+ SDK参考(翻译版本)

    目标 Microsoft Windows GDI+是为C/C++开发者提供的一个基于类的应用程序编程接口(API)。它使得程序可以同时在视频显示器和打印机上使用图形和格式化文本。...需要精通Windows图形用户接口和消息驱动机制。

    《对话框》之《SOCKET类的设计和实现》

    它在Berkeley接口函数的基础之上,还增加了基于消息驱动机制的Windows扩展函数。Winscok1.1只支持TCP/IP网络,WinSock2.0增加了对更多协议的支持。这里,讨论TCP/IP网络上的API。 Socket接口包括三类函数:

    learningGUI移植

    LearningGUI的特点和优势。 LearningGUI被设计成独立于具体的硬件平台和具体的软件平台, ...提供消息驱动机制。 提供类似于Win32 SDK式样的API接口。 开发LearningGUI的目的是替代emWin,同时抢占中低端的QT市场。

    Windows系统的消息机制

    简要Windows系统的消息机制Windows 的工作方式——窗口、事件和消息

    大富翁手机游戏开发实战 基于Cocos2d-x3.2引擎

    避免空泛的原理讲解,在理解了原理之上紧接着根据大富翁项目展开实际代码编写,从中能让读者领悟Cocos2d-x的神奇魅力,从而更加深入地理解和掌握Cocos2dx引擎,更能让读者深刻理解消息驱动机制在提升游戏效率方面的...

    C# Message (消息机制)

    Windows下应用程序的执行是通过消息驱动的。消息是整个应用程序的工作引擎,我们需要理解掌握我们使用的编程语言是如何封装消息的原理。

    windows陈旭设计-王艳平

    好处是使读者撇开C++的特性专心熟悉Win32 编程思路和消息驱动机制。 但是,在开发大型系统的时候,往往并不完全直接使用API 函数,而是使用MFC 类库框架程序。MFC 对90%以上的API 函数进行了面向对象化包装,完全...

    Android应用程序消息处理机制

    Android应用程序与传统的PC应用程序一样,都是消息驱动的。也就是说,在Android应用程序主线程中,所有函数都是在一个消息循环中执行的。Android应用程序其它线程,也可以像主线程一样,拥有消息循环。Android应用...

    WindowsSockets规范及应用

    也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。 Windows Sockets规范本意在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守。此外,在一个...

    微型嵌入式GUI演示程序

    主体采用 消息驱动 机制 ...... -------------------------------------------------------------------------------- 目前可以使用的控件有: MainWindow 主窗口 DialogWindow 对话窗口 Button 按钮,多种风格...

Global site tag (gtag.js) - Google Analytics