通知區(qū)域名稱(chēng)有趣的歷史假如說(shuō)到windows通知區(qū)域,可能很多人還是不清楚它是什么。如果改稱(chēng)Tray區(qū)域,可能有人就懂了。如果再白話點(diǎn),叫它“托盤(pán)”或者“系統(tǒng)托盤(pán)”,可能會(huì)有更多的人猜到它是windows什么部位?,F(xiàn)在我們揭開(kāi)它真實(shí)的面紗,以windows7系統(tǒng)為例,下圖就是它的通知區(qū)域。(轉(zhuǎn)載請(qǐng)指明出于breaksoftware的csdn博客)
其實(shí),我們叫通知區(qū)域?yàn)椤巴斜P(pán)”或者“系統(tǒng)托盤(pán)”是錯(cuò)誤的。這個(gè)錯(cuò)誤并非來(lái)源于中文翻譯,而是來(lái)源于windows發(fā)展史上人們對(duì)其錯(cuò)誤的認(rèn)識(shí)。后來(lái),這個(gè)命名也影響了中國(guó)一批程序員。我這兒要摘錄一個(gè)微軟老員工的回憶錄《The Old New Thing》(中文名《windows編程啟示錄》)一書(shū)中關(guān)于這個(gè)錯(cuò)誤認(rèn)識(shí)起源的一段,還是蠻有意思的。 “后來(lái),我們將通知圖標(biāo)添加到任務(wù)欄中?!?/p> “我認(rèn)為人們開(kāi)始將通知區(qū)域叫作系統(tǒng)托盤(pán)是因?yàn)樵赪indows95中包含了一個(gè)systray.exe的程序,這個(gè)程序在通知區(qū)域中顯示了一些圖標(biāo),如音量控制,PCMCIA(在當(dāng)時(shí)是叫這個(gè)名字)的狀態(tài)、電池的電量表等。如果你終止了systray.exe,那么這些通知圖標(biāo)也將會(huì)消失。因此人們就認(rèn)為,‘啊,systray程序一定是管理這些圖標(biāo)的組件,我敢打賭這個(gè)組件的名字就叫作“系統(tǒng)托盤(pán)”’。于是這個(gè)誤解就形成了,而我們這十幾年來(lái)一直都在努力澄清這個(gè)誤解。” “更糟糕的是,其他的團(tuán)隊(duì)(Shell之外的團(tuán)隊(duì))也錯(cuò)誤地使用了這個(gè)詞,并且開(kāi)始在他們自己的文檔和示例程序里面都使用了系統(tǒng)托盤(pán)這個(gè)詞,其中有一些地方甚至錯(cuò)誤地聲稱(chēng)系統(tǒng)托盤(pán)就是通知區(qū)域的正式名稱(chēng)。” “有人可能會(huì)問(wèn),‘你為什么要關(guān)心這個(gè)名字的正誤?既然現(xiàn)在所有的人都叫這個(gè)名字,你也可以隨波逐流嘛?!?/p> “如果每個(gè)人都叫錯(cuò)了你的名字,你會(huì)樂(lè)意嗎?” 其實(shí)我覺(jué)得,如果微軟真的想徹底摒棄“系統(tǒng)托盤(pán)”這個(gè)名稱(chēng),最好是從現(xiàn)在做起,將通知區(qū)域的一些信息都修改成和Tray這個(gè)單詞無(wú)關(guān)。可是,我們使用Spy++查看Windows7任務(wù)欄的組成時(shí)就會(huì)發(fā)現(xiàn),Tray這個(gè)單詞無(wú)處不在?。?/p>
“僵尸圖標(biāo)”說(shuō)了這么多歷史故事,我們?cè)倩氐轿覀冞@篇博文要講述的問(wèn)題上。其實(shí)這個(gè)問(wèn)題,依舊是個(gè)歷史問(wèn)題。還好,我發(fā)現(xiàn)vista之后的系統(tǒng)上,微軟已經(jīng)意識(shí)并修復(fù)了這個(gè)設(shè)計(jì)缺陷。我們看下下面的場(chǎng)景 很多使用Windows的人可能都遇到過(guò)這個(gè)問(wèn)題:通知區(qū)域出現(xiàn)了N個(gè)相同的“僵尸”圖標(biāo)。如果我們有意或者無(wú)意讓光標(biāo)劃過(guò)這些圖標(biāo)時(shí),這些圖標(biāo)會(huì)悄然消失。我們對(duì)這種現(xiàn)象,往往是疑惑一下就拋之腦后。然而,目前我在項(xiàng)目中就接到一個(gè)需求:把這些“僵尸”圖標(biāo)自動(dòng)消失。出于我們產(chǎn)品的設(shè)計(jì),我們存在出現(xiàn)這么多“僵尸”圖標(biāo)的場(chǎng)景,于是為了優(yōu)化用戶(hù)體驗(yàn),我需要找到一種方法去解決這種體驗(yàn)問(wèn)題。
通知區(qū)域圖標(biāo)的正常生死過(guò)程首先要分析一下這個(gè)問(wèn)題出現(xiàn)的原因。一般來(lái)說(shuō),一個(gè)程序在創(chuàng)建時(shí),可能會(huì)在通知區(qū)域創(chuàng)建一個(gè)圖標(biāo)。
創(chuàng)建圖標(biāo)之前,我們需要初始化一個(gè)圖標(biāo)
這個(gè)地方需要注意的是下面幾個(gè)參數(shù):
圖標(biāo)初始化后,我們要將圖標(biāo)增加到通知區(qū)域
這個(gè)圖標(biāo)是可以表明“這個(gè)進(jìn)程還活著”;而且在無(wú)界面展現(xiàn)時(shí),讓用戶(hù)方便喚起界面或者執(zhí)行相應(yīng)的功能。比如QQ的通知區(qū)域圖標(biāo),它的存在表明QQ進(jìn)程還是存在的。我們可以左鍵雙擊之,可以讓主界面展現(xiàn)出來(lái);還可以右擊之,可以出現(xiàn)很多快捷功能鍵
相應(yīng)的,如果進(jìn)程退出,應(yīng)該通知系統(tǒng)通知區(qū)域:要將我設(shè)置的通知區(qū)域圖標(biāo)刪除,因?yàn)槲荫R上要退出了。
如果一切都如此按照規(guī)律的“正常生死”,也就沒(méi)有之前提出的問(wèn)題。可是,出于策略考慮以及一些異常情況,進(jìn)程的意外死亡還是不可避免的。這樣,如果出現(xiàn)連續(xù)的意外死亡場(chǎng)景,系統(tǒng)通知區(qū)域就會(huì)殘留很多“僵尸”圖標(biāo)。為了大戰(zhàn)這些“僵尸”,我們需要找到這些“僵尸”的家,然后對(duì)“僵尸”各個(gè)擊破。于是,我們要看下各系統(tǒng)下通知區(qū)域的樹(shù)狀結(jié)構(gòu)圖。 XP、Win7下通知區(qū)域的結(jié)構(gòu)先使用SPY++看下XP下任務(wù)欄即通知區(qū)域的結(jié)構(gòu)
SysPager下類(lèi)名為T(mén)oolbarWindow32的控件就是系統(tǒng)通知區(qū)域。非常慶幸,XP下只有這么一個(gè)通知區(qū)域,而且這個(gè)通知區(qū)域一直是可見(jiàn)的(Win7下有個(gè)不可見(jiàn)的通知區(qū)域)。 再看下Win7的通知區(qū)域結(jié)構(gòu)
鑒于XP的通知區(qū)域的結(jié)構(gòu)簡(jiǎn)單性,我決定先從XP系統(tǒng)入手。其實(shí)XP上的解決方案是多種的,也是非常有意思的。詳細(xì)的分析過(guò)程可以參看下篇博文《一種清除windows通知區(qū)域“僵尸”圖標(biāo)的方案——XP系統(tǒng)解決方案》。
更多
2
|
|
|
來(lái)自: quasiceo > 《待分類(lèi)1》