在很多的编程书籍里面往往把windows消息归于窗口,当然,这样这样讲一般也不会造成什么麻烦,对新手来说这样认识也足够了,但严格来说是不对的。
的确windows消息处理很多时候都是与窗口相关的,编程中经常处理的鼠标,键盘,菜单命令等消息基本都是与图形界面相关的,自然离不开窗口。
而且常用的消息处理函数如SendMessage()与PostMessage()函数的参数也是以窗口句柄作为发送的目标。这就更加容易让人感觉消息队列等windows消息机制是属于窗口所有的。
其实只要看到PostThreadMessage()这个函数,应该就不难想到windows消息其实是属于线程而非窗口的。(线程是可以没有窗口的,而窗口一定要有线程)
一个线程建立时,并不会构造一个消息队列,而一旦这个线程试图对消息进行处理,如调用GetMessage()等函数获得消息,系统这时就会为其分配消息队列等相关的资源。
在《windows核心编程》中明确的记载着关于消息是属于线程的这一事实:
“当一个线程第一次被建立时,系统假定线程不会被用于任何与用户相关的任务。这样可以减少线程对系统资源的要求。但是,一旦这个线程调用一个与图形用户界面有关的函数(例如检查它的消息队列或建立一个窗口),系统就会为该线程分配一些另外的资源,以便它能够执行与用户界面有关的任务。特别是,系统分配一个T H R E A D I N F O结构,并将这个数据结构与线程联系起来。”
windows消息是属于windows线程的一种机制,而与windows窗口没有直接的关系。
可能有人会问,一个没有窗口的线程虽然可以获得和处理消息,但有意义吗?当然有,如果你的程序只是一个后台服务,那么,你就完全不必为其分配窗口等多余的资源,只要使其能够处理热键或者程序的通讯就可以了。虽然后者socket也可以做到,不过显然如果你不需要“网络通讯”用消息来做会简单得多。