Shell_NotifyIcon函數,向
任務欄的狀態欄發送一個消息
函數原型
BOOL Shell_NotifIcon(
DWORD
dwMessage,
PNOTIFYICONDATA
lpdata
);
參數:
dwMessage為輸入參數,傳遞發送的消息,表明要執行的操作。可選的值如下:
NIM_ADD
向托盤區域添加一個圖標。此時第二個參數lpdata指向的
NOTIFYICONDATA
結構體中的hWnd和uID成員用來標示這個圖標,以便以后再次使用Shell_NotifyIcon對此圖標操作。
NIM_DELETE
刪除托盤區域的一個圖標。此時第二個參數lpdata指向的NOTIFYICONDATA
結構體中的hWnd和uID成員用來標示需要被刪除的這個圖標。
NIM_MODIFY
修改托盤區域的一個圖標。此時第二個參數lpdata指向的NOTIFYICONDATA
結構體中的hWnd和uID成員用來標示需要被修改的這個圖標。
NIM_SETFOCUS
Version 5.0. 設置焦點。比如當用戶操作托盤圖標彈出菜單,而有按下ESC鍵將菜單消除后,程序應該使用此消息來將焦點設置到托盤圖標上。
NIM_SETVERSION
Version 5.0. 設置
任務欄按照第二個參數lpdata指向的NOTIFYICONDATA
結構體中的uVersion成員指定的版本號來工作。此消息可以允許用戶設置是否使用基於Windows2000的version 5.0的風格。uVersion的缺省值為0,默認指明了使用原始Windows 95圖標消息風格。具體這兩者的區別請參考msdn中的Shell_NotifyIcon函數說明的Remarks。
如果圖標操作成功返回TRUE,否則返回FALSE。
如果dwMessage參數設為NIM_SETVERSION,則如果版本設置成功返回TRUE,如果設置的版本不支持返回FALSE。
該函數主要用於
任務欄右側的托盤圖標的操作。在MFC中,實現最小化到托盤的具體操作如下:
1.在Resource里新建一個圖標 Icon 。
2.在窗體類里添加 NOTIFYICONDATA
結構體對象 m_nfData,可以在OnInitDialog()方法里對結構體進行初始化。
3.重寫OnSize(UINT,int,int)函數,自行處理SIZE_MINIMIZED 消息,即點擊最小化后的處理。例如:
void CYourProjectDlg::OnSize(UINT nType, int cx, int cy)
{
if( nType == SIZE_MINIMIZED ) //截獲消息
{
Shell_NotifyIcon(NIM_ADD,&m_nfData);
ShowWindow(SW_HIDE);
}
else //其他消息按默認處理方式處理
CDialog::OnSize(nType, cx, cy);
}
4.添加消息映射,處理WM_TRAYICON消息,即點擊托盤圖標后的處理
ON_MESSAGE(WM_TRAYICON,&CYourProjectDlg::OnTrayIcon)
5.實現消息映射函數,添加具體操作,例如:
LRESULT CLogCleanToolDlg::OnTrayIcon(WPARAM wParam, LPARAM lParam)
{
if(lParam ==
WM_LBUTTONDBLCLK) //雙擊托盤圖標
{
Shell_NotifyIcon(NIM_DELETE,&m_nfData);
ShowWindow(SW_SHOWNORMAL);
}
return 0;
}
以上就是最常見的用法。如果要其他個性操作,只需修改
NOTIFYICONDATA
結構體的參數即可
NOTIFYICONDATA是一個函數公式主要含義和作用是以此函數用來向
任務欄托盤區域發送消息。
函數格式
BOOL Shell_NotifyIcon( DWORD dwMessage,PNOTIFYICONDATA lpdata);
dwMessage為輸入
參數,傳遞發送的消息,表明要執行的操作。可選的值如下:
NIM_ADD
向托盤區域添加一個圖標。此時第二個參數lpdata指向的NOTIFYICONDATA
結構體中的hWnd和uID成員用來標示這個圖標,以便以后再次使用Shell_NotifyIcon對此圖標操作。
NIM_DELETE
刪除托盤區域的一個圖標。此時第二個參數lpdata指向的NOTIFYICONDATA
結構體中的hWnd和uID成員用來標示需要被刪除的這個圖標。(說明,刪除托盤區一般情況下指定hWnd和uID就可以了,但也有例外,當向托盤區添加完圖標后,鼠標右擊托盤圖標,應用程序這時會彈出一個菜單,左鍵單擊一個菜單項。假如應用程序彈出了一個對話框,好,把它關掉,這時再右鍵單擊托盤區圖標,在彈出的菜單中選擇“退出”菜單,結果,程序退出了,而圖標卻還在那,如果這時把鼠標移到圖標上,圖標會立馬消失。但這不是我們想要的結果。所以要想保證程序退出時托盤區圖標消失,請添加如下語句:
NOTIFYICONDATA tnid;
tnid.uFlags = NIF_ICON;
OK。這樣就大功告成了。)
NIM_MODIFY
修改托盤區域的一個圖標。此時第二個參數lpdata指向的NOTIFYICONDATA
結構體中的hWnd和uID成員用來標示需要被修改的這個圖標。
NIM_SETFOCUS
Version 5.0. 設置焦點。比如當用戶操作托盤圖標彈出菜單,而有按下ESC鍵將菜單消除后,程序應該使用此消息來將焦點設置到托盤圖標上。
NIM_SETVERSION
Version 5.0. 設置
任務欄按照第二個參數lpdata指向的NOTIFYICONDATA
結構體中的uVersion成員指定的版本號來工作。此消息可以允許用戶設置是否使用基於Windows2000的version 5.0的風格。uVersion的缺省值為0,默認指明了使用原始Windows 95圖標消息風格。具體這兩者的區別請參考msdn中的Shell_NotifyIcon函數說明的Remarks。
如果圖標操作成功返回TRUE,否則返回FALSE。
如果dwMessage參數設為NIM_SETVERSION,則如果版本設置成功返回TRUE,如果設置的版本不支持返回FALSE。
包含系統需要的用來傳遞托盤區域消息的信息。
typedef struct _NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
TCHAR szTip[64];
DWORD dwState;
DWORD dwStateMask;
TCHAR szInfo[256];
union {
UINT uTimeout;
UINT uVersion;
};
TCHAR szInfoTitle[64];
DWORD dwInfoFlags;
GUID guidItem;
} NOTIFYICONDATA, *PNOTIFYICONDATA;
6成員說明編
cbSize
hWnd
窗口的句柄。標示的窗口用來接收與托盤圖標相關的消息。Shell_NotifyIcon
函數調用時,hWnd和uID成員用來標示具體要操作的圖標。
uID
應用程序定義的任務欄圖標的標識符。Shell_NotifyIcon函數調用時,hWnd和uID成員用來標示具體要操作的圖標。通過將多次調用,你可以使用不同的uID將多個圖標關聯到一個窗口hWnd。
uFlags
此成員表明具體哪些其他成員為合法數據(即哪些成員起作用)。此成員可以為以下值的組合:
NIF_ICON
hIcon成員起作用。
NIF_MESSAGE
uCallbackMessage成員起作用。
NIF_TIP
szTip成員起作用。
NIF_STATE
dwState和dwStateMask成員起作用。
NIF_INFO
使用氣球提示代替普通的工具提示框。szInfo, uTimeout, szInfoTitle和dwInfoFlags成員起作用。
NIF_GUID
保留。
uCallbackMessage
應用程序定義的消息標示。當托盤圖標區域發生鼠標事件或者使用鍵盤選擇或激活圖標時,系統將使用此標示向由hWnd成員標示的窗口發送消息。消息響應函數的wParam參數標示了消息事件發生的
任務欄圖標,lParam參數根據事件的不同,包含了鼠標或鍵盤的具體消息,例如當
鼠標指針移過托盤圖標時,lParam將為WM_MOUSEMOVE。
hIcon
增加、修改或刪除的圖標的句柄。注意,windows不同版本對於圖標有不同要求。Windows XP可支持32位。
szTip
指向一個以\0結束的字符串的
指針。字符串的內容為標准工具提示的信息。包含最后的\0字符,szTip最多含有64個字符。
對於Version 5.0 和以后版本,szTip最多含有128個字符(包含最后的\0字符)。
dwState
Version 5.0,圖標的狀態,有兩個可選值,如下:
NIS_HIDDEN
圖標隱藏
NIS_SHAREDICON
圖標共享
dwStateMask
Version 5.0. 指明dwState成員的那些位可以被設置或者訪問。比如設置此成員為NIS_HIDDEN,將導致只有hidden狀態可以被獲取。
szInfo
Version 5.0. 指向一個以\0結束的字符串的
指針。字符串的內容為氣球提示內容。最多含有255個字符。如果要移除已經存在的氣球提示信息,設置uFlags成員為NIF_INFO,同時將szInfo設為空。
uTimeout
和uVersion成員為
聯合體。uTimeout表示氣球提示超時的時間,單位為毫秒,此時間后氣球提示將消失。系統默認氣球提示的超時時間最小值為10秒,最大值為30秒。如果設置的uTimeout的值小於10將設置最小值,如果大於30將設置最大值。將超時時間分為最大最小兩種,是因為解決不同圖標的氣球提示同時彈出的問題,詳細內容請參考MSDN中NOTIFYICONDATA
結構體說明的remarks。
uVersion
Version 5.0. 和uTimeout成員為
聯合體。用來設置使用Windows 95 還是 Windows 2000風格的圖標消息接口。請參考Shell_NotifyIcon函數的說明獲取更多信息。只有當使用Shell_NotifyIcon函數發送NIM_SETVERSION消息時,此成員才有作用。可選的值如下:
0
使用Windows 95風格。針對Windows 2000版本之前的windows設計的軟件請使用此值。
NOTIFYICON_VERSION
使用Windows 2000風格。 針對Windows 2000版本以及以后版本的windows設計的軟件請使用此值。
szInfoTitle
Version 5.0. 指向一個以\0結束的字符串的指針。字符串的內容為氣球提示的標題。此標題出現在氣球提示框的上部,最多含有63個字符。
dwInfoFlags
Version 5.0. 設置此成員用來給氣球提示框增加一個圖標。增加的圖標出現在氣球提示標題的左側,注意如果szInfoTitle成員設為空字符串,則圖標也不會顯示。可選值如下:
NIIF_ERROR
錯誤圖標。
NIIF_INFO
信息圖標。
NIIF_NONE
沒有圖標。
NIIF_USER
使用用戶使用hIcon成員指明的圖標,要求Windows XP Service Pack 2 (SP2)或以后系統。
NIIF_WARNING
警告圖標。
NIIF_ICON_MASK
Version 6.0. 保留。
NIIF_NOSOUND
Version 6.0. 禁止播放相應聲音。
guidItem
Version 6.0. 保留。