文档介绍:注:以下所说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;
当一个线程第一次被建立时,系统假定线程不会被用于任何与用户相关的任务。这样可以减少线程对系统资源的要求。但是,一旦这个线程调用一个与图形用户界面有关的函数(例如检查它的消息队列或建立一个窗口),系统就会为该线程分配一些另外的资源,以便它能够执行与用户界面有关的任务。因此进程在建立之初,并没有与用户界面相关的数据结构,,进程会转化为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)、以及用来描述线程局部输入状态的