窗口与线程的关系
文章目錄
- 能產(chǎn)生消息的四種情況
- 消息到哪里去
- 如何通過窗口找到消息隊(duì)列呢?
- 窗口在哪?
- 窗口對象
- 子窗口控件:
- Windows把窗口對象放在0環(huán),那么我們?nèi)绾稳ゲ僮鞔翱谀?#xff1f;
- 總結(jié):
能產(chǎn)生消息的四種情況
消息到哪里去
當(dāng)鼠標(biāo)點(diǎn)擊按鈕時,那么這個消息就會去這個窗口所對應(yīng)線程的消息隊(duì)列,w32k.sys中開啟了兩個線程監(jiān)聽鼠標(biāo)和鍵盤:
這就是為什么程序卡死之后,鼠標(biāo)還能動的原因。因?yàn)?strong>鼠標(biāo)的監(jiān)控是在0環(huán)的一個線程,和程序無關(guān)。
如何通過窗口找到消息隊(duì)列呢?
首先我們得了解窗口實(shí)際是在哪?所以需要近一步往下了解
窗口在哪?
用IDA看user32.dll中的CreateWindow,跟蹤到3環(huán)的最后一步,然后就進(jìn)入了0環(huán),進(jìn)行下一步操作。
也就說是:
CreateWindow畫窗口,進(jìn)入0環(huán),大于1000進(jìn)入的就是W32k.sys這個模塊,小于1000進(jìn)入的就是讓ntosKernel這個模塊,關(guān)于窗口的一切詳細(xì)信息全在0環(huán)中。
窗口對象
_WINDOW_OBJECT(0環(huán)結(jié)構(gòu)體)的結(jié)構(gòu):
……
PTHREADINFO pti;//所屬線程
……
PTHREADINFO pti表示當(dāng)前這個窗口指向哪個線程
這里不止一個窗口,包括那些按鈕,也屬于窗口,也就是說這里有十多個窗口,這些窗口都屬于一個線程。(這些按鈕就是子窗口控件)
子窗口控件:
1.WINDOWS提供了幾個預(yù)定義的窗口類以方便我們的使用,我們一般把它們叫做子窗口控件,簡稱控件
2.控件會自己處理消息,并在自己狀態(tài)發(fā)生狀態(tài)改變時通知父窗口
3.預(yù)定義的控件有:按鈕,復(fù)選框,編輯框,靜態(tài)字符串標(biāo)簽和滾動條
窗口對象中還有一個重要成員是Wnd
這里面有一些重要信息:當(dāng)前窗口什么風(fēng)格,父窗口,子窗口這些,以及窗口過程等。
Windows把窗口,畫窗口,消息處理全部放在0環(huán)(關(guān)于窗口的數(shù)據(jù)問題都在0環(huán))。不需要考慮線程通信問題。
Windows把窗口對象放在0環(huán),那么我們?nèi)绾稳ゲ僮鞔翱谀?#xff1f;
在0環(huán)的對象,不可能把實(shí)際地址直接告訴我們,因?yàn)?環(huán)一旦出錯,直接藍(lán)屏。所以它跟那些進(jìn)程對象和線程對象有相同的地方,但是也有不同的地方。
相同的地方:對窗口對象進(jìn)行操作時,使用0環(huán)返回來的一個窗口句柄值(也就是一個實(shí)際內(nèi)核對象地址的一個索引值),也就是說,窗口在零環(huán)也有個句柄表
不同的地方:這個句柄表是全局的,拿到窗口的句柄值都一樣,而且都有效。
總結(jié):
總結(jié)
- 上一篇: 消息机制(GUI线程讲解)
- 下一篇: 从内核层说清GetMessage , D