系統托盤

系統托盤

系統托盤是個特殊區域,通常在桌面的底部,在那裡,用戶可以隨時訪問正在運行中的那些程式。在微軟的Windows里,系統托盤常指系統列的狀態區域;在Gnome的桌面時,常指布告欄區域;在KDE桌面時,指系統托盤。在每個系統里,托盤是所有正運行在桌面環境裡的應用程式共享的區域。

訪問系統托盤

java.awt.SystemTray代表了桌面上的系統托盤。通過調用靜態方法SystemTray.getSystemTray()來訪問系統托盤。然後,在調用此方法前,應該用靜態方法SystemTray.isSupported()來檢測系統托盤是否可被支持。如果作業系統上系統托盤還未準備就緒或者不被支持,那么方法

isSupported()返回false。此時,應用程式如果試圖調用方法 getSystemTray(),那么將拋出異常 java.lang.UnsupportedOperationException

每個Java應用程式有一個單一的SystemTray實例。因此,一個應用程式不應創建它本身的SystemTray實例,而是應通過調用方法getSystemTray()來獲得當前可用的系統托盤。

系統托盤包含一個或多個托盤圖示,這些圖示是以調用方法add(java.awt.TrayIcon)添加的,當不需要這些圖示的時候,通過調用方法remove(java.awt.TrayIcon)來剔除。

注意:Mustang新增加的代碼庫里指出,如果JAVA運行環境或作業系統發現不能把圖示添加到系統托盤的時候,方法add()會拋出一個AWTException異常。例如,在X-WINDOWS桌面環境下,如果

系統托盤不存在,那么AWTException異常將拋出。

使用技巧

設定NOTIFYICONDATA型的結構體變數的成員變數的值: cbSize 該結構體的大小。 hwnd 視窗的句柄。當滑鼠滑過該小圖示時,該視窗將接收到相關的訊息。 uID 小圖示的ID號。您可以取任意值,只是當您的應用程式有不止一個小圖示時,您要能夠區分出到底是那一個小圖示接收到了滑鼠的訊息,也即ID號必須唯一。 uFlags 指定該結構體變數的那些成員變數有效。 NIF_ICON 有效。 NIF_MESSAGE 有效。 NIF_TIP 有效。 uCallbackMessage 自定義的訊息。當滑鼠對小圖示動作時,WINDOWS外殼將把該訊息傳送到您的應用程式。該訊息的值您可以自己定義。 hIcon 放入系統托盤中的圖示的句柄。 szTip 64位元組的緩衝區,它用來放入提示字元串,當滑鼠停留在小圖示上時,就會顯示該字元串。 調用Shell_NotifyIcon函式。該函式在shell32.inc中定義,其原型如下:

Shell_NotifyIcon PROTO dwMessage:DWORD ,pnid:DWORD dwMessage 是傳送到WINDOWS外殼的訊息:

NIM_ADD 把小圖示加到系統托盤區。

NIM_DELETE 從系統托盤中刪除小圖示。

NIM_MODIFY 修改小圖示。

pnid 是指向NOTIFYICONDATA型結構體變數的指針。

如果您想要加入一個小圖示就用NIM_ADD,刪除時使用NIM_DELETE訊息。

基本上的訊息就是這些。但是大多數的情況下,您不會僅僅滿足把一個小圖示放到那裡。您還必須要對滑鼠事件作出適當的反應。您可以在NOTIFYICONDATA型的結構體變數的成員變數uCallbackMessage 中設定您要處理的訊息,然後WINDOWS外殼將在發生這些事件時通知您的應用程式。隨著訊息傳送的參數wParam和lParam的值如下:

wParam 小圖示的ID號。它和您在NOTIFYICONDATA型結構體變數中的成員變數uID中設定的值一樣。 lParam 低字包含滑鼠訊息。譬如,用戶在小圖示上按下了右鍵時,lParam中將包含WM_RBUTTONDOWN訊息。 大多數的系統托盤中的小圖示,在用戶用滑鼠右擊時都會彈出一個選單以方便用戶選擇。我們可先創建選單,然後調用TrackPopupMenu函式來顯示它。步驟如下:

調用CreatePopupMenu函式來創建選單。該函式創建一個空的選單。如果成功,將在eax中返回該選單的句柄。 調用AppendMenu, InsertMenu 或 InsertMenuItem來向選單中加入選單項。 當您想在當前滑鼠位置顯示該選單時,調用GetCursorPosition函式來得到滑鼠當前的螢幕位置,然後調用TrackPopupMenu來顯示選單。當用戶從彈出式選單中選擇了一個選單項時,WINDOWS將傳送WM_COMMAND訊息給您應用程式的訊息處理過程,這和通常的選單選擇是一樣的。

常見問題

注意:當您使用系統托盤中的小圖示時有兩件比較討厭的事:

該選單可能不會像通常那樣馬上消失掉。這是因為從彈出式接收訊息的視窗必須是前景視窗。調用SetForegroundWindow函式就可以糾正該錯誤; 在調用了SetForegroundWindow函式後,您會發現第一次該彈出式選單會正常彈出而且工作的很好。但是隨後,該選單只是一彈出就立即消失。根據MSDN,這么做是故意的。為了使得彈出選單保持住,必須要求下一個切換到的是程式的主視窗。您可以通過郵寄任何訊息給該程式的視窗來強行進行任務切換。注意要使用PostMessage而不是SendMessage。

相關搜尋

熱門詞條

聯絡我們