Windows 窗口程序的运行过程

如图所示:

  1. 操作系统角度:
    1. Windows内核中维护了两个消息队列:系统消息队列 程序消息队列(采用虚拟内存,故对一个程序来说,只能看到自己的那份消息队列里的内容)
    2. 用户的各种I/O操作,先被操作系统收录到 系统消息队列,然后再经过分配,分配到 相应的 程序消息队列中。(系统消息队列相当于快递的中转站,最终要从送到用户手上)
    3. 此时,消息已经分配到消息队列中,但这是,并不意味着 在用户区的 程序一定收到。(因为相当于快递,操作系统只是告诉你送到你的相应柜子里,你可以去拿,可以不去拿。)
  2. 用户程序角度:
    1. 首先,用户代码想创建一个窗口程序,它需要向操作系统申请,分为以下几个步骤:
      1. 句柄获取(告诉操作系统,自己属于哪个)
      2. 注册窗口(相当于向操作系统填写表单,申请表申请一个窗口)
      3. 创建窗口(操作系统批准,创建一个窗口)
      4. 展示窗口(最简单版本先展示一下)
      5. 更新窗口(看一下没问题之后,将自己的数据展示上去)
    2. 窗口创建完毕,此时就需要正常开始工作了,它需要知道用户发送给它什么消息,然后做出对应的处理。
    3. (1 2 3)此时,消息已经被保存在内核中的 程序消息队列 中了,程序想获取它,但用户区的代码无法访问直接访问内核区,所以,把程序执行权限交给user32.dll库中的API,从内核对应的 程序消息队列 中获取用户消息,然后再将控制权归还给用户。
    4. 之后,调用translateMessage或其他函数对消息进程预处理,比如讲键盘输入的字符转换为ASCII码等等。
    5. (4 5 6 7 8)之后,通过调用DispatchMessage来找到其对应的 窗口过程(窗口过程就是对应处理程序消息的函数),当处理完成这个之后,会返回去,然后再循环处理下一个消息。
  3. 从其他程序的角度:
    1. 程序直接可以互相发送消息,其使用postmassage,注意,其直接发送到对应的 程序消息队列,而不是发送到系统消息队列再让操作系统去分发。
    2. 其他应用程序也可以使用sendmessage直接调用 其他程序的窗口过程,其实 窗口过程 就是一个函数,只要权限允许,别的程序也可以调用。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值