以消息为基础,以事件驱动之

程序的进行依靠外部消息来驱动,即:程序不断等待任何可能的输入,然后做判断,然后再做适当的处理。

消息输入:操作系统捕获,以消息形式进入程序。(操作系统通过其USERS模块中掌管各个外围的驱动程序来侦测。他们有侦测循环)

输入:硬件输入放在系统队列 里+软件输入放在程序队列里。

应用程序调用GetMessage API取得消息。

个人理解windows消息机制:

窗口注册的时候做了一下动作:

注册窗口类(指定窗口函数)+创建窗口。这样操作系统就知道一个窗口对象的窗口函数是谁了。当应用程序得到一个消息之后发现句柄是自己的窗口对象之一,那么就告诉操作系统,这个是这个家伙的消息,相当于把对象指针给操作系统,操作系统就给应用程序说:哦,他的窗口函数是winproc,你去调用吧。应用程序说:好的,我这就去。这样应用程序就去调用这个对象的系统函数了。

1.系统的侦测循环侦测到一个动作,会自动判断其所操作的对象,这里的判断可以通过动作(一般是鼠标或键盘),比如如果是侦测到鼠标操作左键点击,那么会检测到鼠标当前的位置,然后再检测当前界面上的dlg对象的位置,判断出具体点击的是哪一个。

2.找到了之后,就将被点击的对象的句柄等信息生成一个结构体对象,这样就产生了一个消息。将消息放入到消息队列中。

3.应用程序就像有一个电动机一个,不停的检测消息队列,将每一个消息都拿过来和自己的各个对象作比较,看是否属于自己的这些对象的消息,如果消息句柄相等了,就属于。如果有属于的消息,就交给对应的对象去处理(调用对象的窗口函数,但是这时候应用程序并不知道窗口函数是什么?所以还好借助系统来处理,因为在注册窗口的时候将窗口函数告知了操作系统的)。

综上可得:消息的处理者是窗口对象,所以每个窗口应该有一个窗口函数来处理消息,在这个窗口函数中,处理自己感兴趣的消息,这里就是程序员自己劳动的天地。

我对windows消息机制的理解(参考深入浅出MFC,欢迎批评指正!!)的更多相关文章

  1. windows消息机制(转)

    1. 引言Windows 在操作系统平台占有绝对统治地位,基于Windows 的编程和开发越来越广泛.Dos 是过程驱动的,而Windows 是事件驱动的[6],这种差别的存在使得很多Dos 程序员不 ...

  2. 深入理解windows 消息机制

    深入理解Windows消息机制 今天我们来学一学Windows消息机制,我们知道在传统的C语音程序中,当我们需要打开一个文件时,我们可以调用fopen()函数,这个函数最后又会调用操作系统提供的函数以 ...

  3. 转:Windows消息机制要点

    Windows消息机制要点 1. 窗口过程     每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ...

  4. Windows消息机制

    Windows的消息系统是由3个部分组成的: · 消息队列.Windows能够为所有的应用程序维护一个消息队列.应用程序必须从消息队列中获取消息,然后分派给某个窗口.· 消息循环.通过这个循环机制应用 ...

  5. <Win32_1>深入浅出windows消息机制[转自crocodile_]

    上学期学习了Java ,感觉Java写一个窗口真心简单,很易上手,也就难怪很多开发人员选择Java作为自己的开发编程语言.但是由于自身对windows的热爱,让我觉得c.c++语言才是我亲睐的编程语言 ...

  6. 收藏:Windows消息机制

    百度百科介绍的windows消息机制也不错:http://baike.baidu.com/view/672379.htm Windows的应用程序一般包含窗口(Window),它主要为用户提供一种可视 ...

  7. windows消息机制框架原理【简单版本】

    windows消息机制框架原理 结合两张图理解 窗口和窗口类 Windows UI 应用程序 (e) 具有一个主线程 (g).一个或多个窗口 (a) 和一个或多个子线程 (k) [工作线程或 UI 线 ...

  8. 深入Delphi -- Windows 消息机制

    http://www.txsz.net/xs/delphi/3/Windows%20%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6.htm Windows 消息机制 by m ...

  9. Windows消息机制要点

    1. 窗口过程     每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wP ...

随机推荐

  1. 匿名函数:Lambda表达式和匿名方法

    匿名函数一个"内联"语句或表达式,可在需要委托类型的任何地方使用.可以使用匿名函数来初始化命名委托,或传递命名委托(而不是命名委托类型)作为方法参数. 共有两种匿名函数: Lamb ...

  2. Integer 与int 赋值比较

    测试代码: @Test public void IntegerTest() { Integer i01 = 59; int i02 = 59; Integer i03 = Integer.valueO ...

  3. Spring MVC学习笔记——Controller接口

  4. 第7章 jQuery插件的使用和写法

    第7章 jQuery插件的使用和写法 插件又称扩展,是一种遵循一定规范的应用程序接口写出来的程序. 插件的编写思想基于面向对象. 获取最新的插件可以查看jquery官网:http://plugins. ...

  5. C#如何把List of Object转换成List of T具体类型

    上周码程序的时候碰到个问题,因为设计上的约束,一个方法接受的参数只能为List<object>类型,然而该方法需要处理的真实数据则是确定的List<Currency>.然而C# ...

  6. IIS7/IIS7.5中目录执行权限的设置方法

    我们在建站的时候,通常有些目录必须给写入权限,这个时候这些目录就很可能被人写入脚本文件,为了将安全性维护得更好,我们可以关闭这些有写入权限的目录的脚本执行权限.IIS6的时候,我们很容易找到关闭的地方 ...

  7. vim tab 中设置title

    在.bashrc添加 export PROMPT_COMMAND='echo -ne "\033]0;your wanted title\007"'

  8. 合并两个结构完全相同的DataTable

    两个结构一模一样的DataTable如何合并? 例子:使用Winform进行演示,表2的数据为固定的,表1的数据可以动态添加,通过合并按钮合并表1和表2的数据到表3 1.规定公共的DataTable结 ...

  9. vim关于 引号和 括号的 高效操作-很好很强大的!

    http://blog.csdn.net/bigshady/article/details/6019963 对括号匹配, 进行跳转, 使用的是%. 匹配的括号, 都会被高亮显示, 但是: 根据光标的 ...

  10. xinetd

    最简安装centos6.4时,xinetd服务是没有安装的,只是在/etc下有xinetd.d目录, 没有xinetd.conf这个配置文件 xinetd is a secure replacemen ...