窗口机制 息循环 消息队列.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
窗口机制 息循环 消息队列

注:以下所说windows线程是指与调用了与图形用户界面相关的函数的线程,而windows进程则是包含windows线程的进程,以区别于一般的进程和线程 一个线程只有一个报文队列,但可以有多个窗口,每个窗口都有WndProc函数 窗口对象如下: Typedef struct _WINDOW_OBJECT{ PW32THREADINFO ti; PDESKTOP Desktop; …… UNICODE_STRING WindowName; …… RECT WindowRect; …… //pointer to the owning thread’s message queue PUSER_MESSAGE_QUEUE MessageQueue; //指向所属进程的消息队列 Struct _WINDOW_OBJECT *FirstChild; Struct _WINDOW_OBJECT *LastChild; Struct _WINDOW_OBJECT *NextSibling; Struct _WINDOW_OBJECT *PrevSibling; //ENTRY in the list of thread windows LIST_ENTRY ThreadListEntry; //Handle to the owner window HWND hOwner; …… WNDPROC WndProc; //消息处理函数 PRTHREAD OwnerThread; //指向具体窗口所属线程的ETHREAD结构 …… }WINDOW_OBJECT; 当一个线程第一次被建立时,系统假定线程不会被用于任何与用户相关的任务。这样可以减少线程对系统资源的要求。但是,一旦这个线程调用一个与图形用户界面有关的函数(例如检查它的消息队列或建立一个窗口),系统就会为该线程分配一些另外的资源,以便它能够执行与用户界面有关的任务。因此进程在建立之初,并没有与用户界面相关的数据结构,只有当进程中某一线程调用win32k.sys中的函数时,进程会转化为windows进程,调用为win2k.sys的线程则转化为windows线程。一个进程只要其中有一个线程是windows线程,则就是windows进程。Windows进程除了EPROCESS和KPROCESS外,还有个W32PROCESS结构,即系统为windows进程所分配的另外一些资源。且EPROCESS结构中的指针Win32Process指向这个数据结构。 当线程转化为windows线程时,系统会为线程分配一个T H R E A D I N F O结构 这个T H R E A D I N F O结构包含一组成员变量,利用这组成员,线程可以认为它是在自己独占的环境中运行。T H R E A D I N F O是一个内部的、未公开的数据结构,用来指定线程的投递消息队列(posted-message queue)、发送消息队列( send-message queue)、应答消息队列( r e p l y -message queue)、虚拟输入队列(virtualized-input queue)、唤醒标志(wake flag)、以及用来描述线程局部输入状态的若干变量。 这里的登记消息即为投递消息(posted-message) 注意:这里的各个消息队列的消息均指的时被投递的消息,被发送的消息……即发送方直接把消息放入接收方的相应消息队列 当线程有了与之相联系的T H R E A D I N F O结构时,线程就有了自己的消息队列集合。 Windows中有两种类型的消息队列 1) 系统消息队列(System Message Queue) 这是一个系统唯一的Queue,设备驱动(mouse, keyboard)会把操作输入转化成消息存在系统队列中,然后系统会把此消息放到目标窗口所在的线程的消息队列(thread-specific message queue)中等待处理 2) 线程消息队列(Thread-specific Message Queue) 每一个GUI线程都会维护这样一个线程消息队列。(这个队列只有在线程调用GDI函数时才会创建,默认不创建)。然后线程消息队列中的消息会被送到相应的窗口过程(WndProc)处理. typedef struct tagMSG {   HWND hwnd; //消息要发向的窗口句柄   UINT message; //消息标示符,以WM_开头的预定义值   WPARAM wParam;   LPARAM lParam;   DWORD time;

文档评论(0)

md85173 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档