windows消息不是发往“窗口”的

      在很多的编程书籍里面往往把windows消息归于窗口,当然,这样这样讲一般也不会造成什么麻烦,对新手来说这样认识也足够了,但严格来说是不对的。
      的确windows消息处理很多时候都是与窗口相关的,编程中经常处理的鼠标,键盘,菜单命令等消息基本都是与图形界面相关的,自然离不开窗口。
      而且常用的消息处理函数如SendMessage()与PostMessage()函数的参数也是以窗口句柄作为发送的目标。这就更加容易让人感觉消息队列等windows消息机制是属于窗口所有的。

其实只要看到PostThreadMessage()这个函数,应该就不难想到windows消息其实是属于线程而非窗口的。(线程是可以没有窗口的,而窗口一定要有线程)

      一个线程建立时,并不会构造一个消息队列,而一旦这个线程试图对消息进行处理,如调用GetMessage()等函数获得消息,系统这时就会为其分配消息队列等相关的资源。

      在《windows核心编程》中明确的记载着关于消息是属于线程的这一事实:
      “当一个线程第一次被建立时,系统假定线程不会被用于任何与用户相关的任务。这样可以减少线程对系统资源的要求。但是,一旦这个线程调用一个与图形用户界面有关的函数(例如检查它的消息队列或建立一个窗口),系统就会为该线程分配一些另外的资源,以便它能够执行与用户界面有关的任务。特别是,系统分配一个T H R E A D I N F O结构,并将这个数据结构与线程联系起来。”

      windows消息是属于windows线程的一种机制,而与windows窗口没有直接的关系。

      可能有人会问,一个没有窗口的线程虽然可以获得和处理消息,但有意义吗?当然有,如果你的程序只是一个后台服务,那么,你就完全不必为其分配窗口等多余的资源,只要使其能够处理热键或者程序的通讯就可以了。虽然后者socket也可以做到,不过显然如果你不需要“网络通讯”用消息来做会简单得多。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值