為什麼 Windows 任務欄通知區域里的圖標在應用程序崩潰後仍然存在,直到移動滑鼠指向它才會消失?

感覺很彆扭,一直如此,是不是故意為之。linux就不這樣。


因為管理托盤圖標的,不是Windows系統內核,而是資源管理器explorer.exe。

一個程序崩潰了,系統內核是知道的,然而explorer.exe本質上只是一個用戶態程序,他是不知道另一個程序崩潰了的。只有當他試圖使用託管在這裡的圖標時才能發現原來那個程序已經不在了,這也就是你滑鼠指上去的瞬間殘留圖標就會消失的原因。


Explorer does not remove the tray icon if the process holding it exits or crashes.

來頂吧


這塊功能就是沒寫好,沒那麼多理由。


因為Windows不會主動檢查托盤圖標的狀態。所有的狀態都是推送的。


是因為Windows很多程序托盤程序與主程序不在同一個進程里,一般托盤程序名為「。。。Tray.exe」主程序崩潰後托盤程序仍在運行,找到並結束進程樹即可。


因為NotifyIcon是應用程序自己管理的,你看到的這個程序退出時沒有銷毀它而已。程序猿的鍋。


因為系統托盤歸explorer管,只有你滑鼠移上去觸發「刷新系統托盤圖標」的操作才會引發變動。

如果應用程序崩潰(自然也就不會去更新托盤圖標狀態)或者應用程序沒處理好,又或者explorer本身掛了,就會產生意料外的結果


托盤圖標由應用程序調用 Shell_NotifyIcon 函數創建的,托盤圖標的刪除也是由應用程序自己調用函數來做的,程序意外崩潰時通常不會有機會調用這個函數刪除托盤圖標,所以圖標仍然存在。

當你的滑鼠指向到托盤圖標時,正常情況下 Explorer 會根據 NOTIFYICONDATA 結構的定義顯示 Tip ,不過這個程序已經崩潰掉不在運行了,所以你指向到圖標的時候 Explorer 就把圖標銷毀掉了。


explorer的鍋。

並沒有加入不停檢測tray的狀態的邏輯。


這個用戶體驗不是很好。按理應該立即消失才是複合正常邏輯思維的


通知刷新再後了!


因為程序自己創建的托盤圖標要自己銷毀,就像重啟資源管理器後某些程序不會重新創建托盤圖標一樣,都是程序自己管理的。


推薦閱讀:

怎樣加快虛擬機上程序的運行速度?
把 C 盤全格了再升 Windows 10 是不是就是正版了?
Windows 進入睡眠前系統會執行哪些操作?
為什麼 Windows 系統快捷方式圖標帶有一個箭頭?
win7下的imageres.dll文件是怎麼做出來的?

TAG:MicrosoftWindows | Windows7 | WindowsXP |