消息送到正确的线程消息队列
大家都知道在键盘输入或点击鼠标时,Windows会将这些消息事件送入系统消息队列,再由系统消息队列送入相应程序的线程队列,那么Windows是如何知道这些鼠标或键盘输入是在哪个窗口发生,又是如何将消息送入正确的线程队列的呢?
当用户键盘输入时,系统会找到当前的激活窗体;而根据用户点击鼠标的坐标,系统也可以找到是在哪个窗体区域内点击了鼠标,从而拿到窗体句柄。操作系统在创建进程和线程时,都同时记录了大量的控制信息(比如通过进程控制块和句柄表可以查到进程所创建的所有线程和引用的核心对象),因此,根据窗体句柄来确定此消息属于哪个UI线程对于操作系统来说是很简单的一件事。操作系统有一个专门的线程负责从系统消息队列中取出消息,根据消息的窗体句柄找到创建它的线程,把消息移动到该线程的消息队列中。
模态窗口的消息循环
当调用ShowModal时,会Repeat调用HandleMessage,接替Application.Run里的HandleMessage工作,这时,整个程序的消息循环就由模态窗口来处理了。