NOTIFYICONDATA structure
這個結構體包含了向通知區域(底部工作列右下角區域,下面都稱為托盤)顯示的資訊。需要使用函數
Shell_NotifyIcon。
結構體成員
1 typedef struct _NOTIFYICONDATA {
2 DWORD cbSize;
3 HWND hWnd;
4 UINT uID;
5 UINT uFlags;
6 UINT uCallbackMessage;
7 HICON hIcon;
8 TCHAR szTip[64];
9 DWORD dwState;
10 DWORD dwStateMask;
11 TCHAR szInfo[256];
12 union {
13 UINT uTimeout;
14 UINT uVersion;
15 };
16 TCHAR szInfoTitle[64];
17 DWORD dwInfoFlags;
18 GUID guidItem;
19 HICON hBalloonIcon;
20 } NOTIFYICONDATA, *PNOTIFYICONDATA;
結構體成員介紹
cbSize
Type: DWORD
結構體的大小,以bytes 為機關。(sizeof(NOTIFYICONDATA))
hWnd
Type: HWND
指向視窗的句柄用于獲得工作列區域關聯的圖示的消息。
uID
Type: UINT
顯示在工作列的圖示的資源ID 号。The application-defined identifier of the
taskbar icon. The Shell uses either (hWnd plus uID) or guidItem to identify which icon to operate on when
is invoked. You can have multiple icons associated with a single hWnd by assigning each a different uID. If guidItem is specified, uID is ignored.
uFlags
Type: UINT
這是個旗幟用于表明工作列圖示顯示的提示資訊包含在這個結構體或者提供額外的資訊。這個成員變量可以是以下值的組合:
NIF_MESSAGE (0x00000001):成員變量uCallbackMessage 是有效的
NIF_ICON (0x00000002):成員變量hIcon 是有效的
NIF_TIP (0x00000004):成員變量szTip 是有效的
NIF_STATE (0x00000008):成員變量dwState 和dwStateMask 是有效的
NIF_INFO (0x00000010):顯示一個氣泡通知。成員變量szInfo,szInfoTitle,dwInfoFlags和uTimeout 是有效的。需要注意的是成員變量uTimeout 隻有在Windows 2000 和 Windows XP系統下有效
- 為了顯示氣泡通知需要指定NIF_INFO 标志并且氣泡的文本資訊在成員變量szInfo 中
- 為了移除氣泡通知需要指定NIF_INFO 标志并且通過成員變量szInfo 指定一個空的字元串
- 隻是為了在工作列添加一個通知的圖示而不顯示通知不要設定NIF_INFO 标示
NIF_GUID (0x00000020)
- Windows 7 and later: 成員變量 guidItem 有效
- Windows Vista and earlier: 保留
NIF_REALTIME (0x00000040):Windows Vista and later 如果氣泡通知不能夠立即顯示則丢棄它。使用這:個标志表示如果實時的資訊延遲顯示将是無意義或誤導的。例如,一個資訊“Your telephone is ringing. ” NIF_REALTIME 這個标志是有意義的隻有當它聯合NIF_INFO 标志。
NIF_SHOWTIP (0x00000080): Windows Vista and later 使用标準的工具提示。正常情況下,當uVersion 被設定為NOTIFYICON_VERSION_4,這個标準的工具提示将被application-drawn 和彈出UI取代。如果這個應用程式想要使用NOTIFYICON_VERSION_4 去展示标準工具資訊,那麼需要指定NIF_SHOWTIP
uCallbackMessage
一個應用程式定義的消息辨別(指向一個函數的位址)。系統使用這個辨別去發送通知消息給hWnd句柄指定的視窗 。滑鼠事件或滑鼠在工作列圖示的矩形邊框上徘徊或工作列圖示被選擇或被鍵盤激活或這些動作觸發氣泡通知,這些通知消息将會被發送給視窗。當成員變量uVersion 是0 或NOTIFYICON_VERSION,當事件發生那麼消息的參數wParam 會包含工作列圖示的ID,這個辨別可以是32 bits 長。參數lParam 中儲存與事件相關的滑鼠或鍵盤的消息。例如,當這個指針在工作列圖示上移過,參數lParam 将被設定為
WM_MOUSEMOVE當成員變量uVersion 被設定為NOTIFYICON_VERSION_4,則成員變量uCallbackMessage 指向的函數将繼續獲得通知消息,但是參數 lParam 和 wParam将會被改變為以下的值:
- LOWORD(lParam) 包含通知事件,例如NIN_BALLOONSHOW, NIN_POPUPOPEN或 WM_CONTEXTMENU.
- HIWORD(lParam) 包含圖示的ID。圖示ID 僅限于一個16 bits 的長度
- GET_X_LPARAM(wParam) 傳回 通知事件NIN_POPUPOPEN, NIN_SELECT, NIN_KEYSELECT和所有的在WM_MOUSEFIRST 和 WM_MOUSELAST之間的滑鼠消息的X 坐标。如果任何的這些消息是被鍵盤生成的那麼wParam 被設為工作列圖示的左上角。對于其他的所有消息,wParam 沒有被定義
- GET_Y_LPARAM(wParam) 傳回通知事件與消息的Y 坐标,定義與 相同
hIcon
Type: HICON
被添加或被修改或被删除的圖示的句柄。Windows XP和之後的系統支援32 BPP的圖示。
如果僅僅提供一個
16x16 像素的圖示,它将被系統縮放到一個高dpi 的值,這将導緻不美觀的結果。建議在你的資源檔案中提供一個16x16 和一個32x32 的圖示。使用
LoadIconMetric去確定圖示被正确的加載與恰當的縮放。備注中有代碼示例
szTip
Type: TCHAR[64]
一個空終止字元串檔案的提示資訊。
包括結束符’\0’它最大能夠包含64個字元。
對于Windows 2000 和之後的系統,szTip 包括結束符’\0’它最大能夠包含128個字元
dwState
Windows 2000 and later. 圖示的狀态,可以以下值其中的一個或兩個:
- NIS_HIDDEN (0x00000001):圖示被隐藏
- NIS_SHAREDICON (0x00000002):圖示資源在多圖示中被共享
dwStateMask
Windows 2000 and later. 一個值指定成員變量
dwState 是被修改還是檢索,可能的值和dwState 是一樣的。例如,設定此成員nis_hidden隻能隐藏的項目狀态,圖示共享點被忽略不管它的值改性
szInfo
Type: TCHAR[256]
Windows 2000 and later. 一個空終止字元串指定氣泡通知顯示的文本包
括終止符’\0’最大可以包含256個字元,但是如果用于容納定位則應該限制在200個英文字元。如果想要移除氣泡通知可以删除圖示(使用
NIM_DELETE)或者設定 uFlags 的的标志為NIF_INFO并且設定szInfo 為空字元串
uTimeout
Windows 2000 and later.注意這個成員變量在Windows Vista 中是過時的。通知的顯示時間是基于系統的可達性設定
與uVersion 一起使用。對于通知逾時的時間是以毫秒為機關的。系統增大最大與最小的逾時時間的值。如果指定的值太大将會被設定為最大值,如果這個值太小則被設定為最小值。系統目前預設的最小值與最大值是10s 和30s。檢視備注獲得對uTimeout 的進一步了解
uVersion
Windows 2000 and later.與uTimeout (在Windows Vista中是過時的)聯合使用。它指定了使用的通知圖示的接口。想要進一步了解不同版本的不同請看
。這個成員變量被使用當且公當使用
發送一個NIM_SETVERSION 消息。
- 0:在Windows 2000 之前将這個值設定為
- NOTIFYICON_VERSION:使用Windows 2000 的行為。Windows 2000以之後的系統的應用程式可以使用這個值
- NOTIFYICON_VERSION_4:使用目前的行為。Windows Vista 和之後的系統的應用程式可以使用這個值
szInfoTitle
Windows 2000 and later. 氣泡通知的标題是一個空終止的字元串。這個标題将會以更大的字型在文本上顯示。包括終止符’\0’最大能夠有64個字元,但是如果用于容納定位那麼應該被限制為48個英文字母
dwInfoFlags
Windows 2000 and later.氣泡通知顯示方式的旗幟。圖示在标題的左邊顯示。如果成員變量szInfoTitle 長度為0,那麼圖示将不會被顯示
NIIF_NONE (0x00000000):無圖示
NIIF_INFO (0x00000001):一個資訊圖示
NIIF_WARNING (0x00000002):一個警告圖示
NIIF_ERROR (0x00000003):一個錯誤圖示
NIIF_USER (0x00000004):Windows XP SP2 and later.
- Windows XP: 使用句柄hIcon 指定的圖示作為氣泡通知标題的圖示
- Windows Vista and later: 使用hBalloonIcon 的圖示辨別作為氣泡通知标題的圖示
NIIF_NOSOUND (0x00000010): Windows XP and later.不會播放關聯的聲音。被設定僅僅用于通知
NIIF_LARGE_ICON (0x00000020):Windows Vista and later. 在版本的圖示将被作為通知圖示。這相當SM_CXICON x SM_CYICON 的尺寸。如果這個标志沒有被設定,這個圖示的尺寸XM_CXSMICON x SM_CYSMICON 将被使用
- 這個标志可以與所有的 stock icons 一起使用
- 應用程式使用老的自定義圖示(hIcon 指定的NIIF_USER)必須提供一個新的SM_CXICON x SM_CYICON 版本在托盤圖示中(hIcon)。這些圖示将被顯示在系統的托盤或者系統的控制區(SCA)
- 新的自定義圖示(NIIF_USER with hBalloonIcon)必須提供一個SM_CXICON x SM_CYICON 的版本在提供的圖示中(hBalloonIcon)
NIIF_RESPECT_QUIET_TIME (0x00000080):Windows 7 and later. 不會顯示氣泡通知如果目前的使用者處于“quiet time”,也就是一個新使用者第一次登入他(她)的賬号的第一個小時,多數的通知将不會被發送或顯示。這使新使用者能夠在不受打擾的情況下熟悉新的電腦系統 。當使用者為系統更新或解除安裝時也會激活
“quiet time”。不處于“quiet time”則通知将會被發送。駁回不顯示是很簡單的。應用程式之後能夠重新發送通知如果這它仍然可用
因為一個應用程式能夠預測什麼時候進入“quiet time”是以我們建議這個标志在任何的應用程式中的恰當通知中被設定,為了新生“quiet time”
在“quiet time”期間,一個通知應該仍然被發送因為他們使用者希望得到回報,例如插入一個USB 裝置或者列印一個檔案
如果目前的使用者不處于“quiet time”,則這個标志沒有效果
NIIF_ICON_MASK (0x0000000F):Windows XP and later. 保留
guidItem
Type: GUID
Windows XP and later.
- Windows 7 and later: 一個注冊的GUID 指定一個圖示。這個值重寫uID 并且這是建議重定義圖示的方法。在成員變量uFlags 必須設定NIF_GUID 标志
- Windows XP and Windows Vista: 保留。必須被設定為0
如果你的應用程式打算在Windows 7 或者Windows Vista 上運作,那麼檢查系統的版本是非常必要的。如果系統是Windows 7 or later 則guidItem 必須為非零值。如果你識别出擁有GUID 的圖示調用了函數
那麼你必須使用同樣的GUID 去識别後來被函數
處理的圖示
為了給這個成員函數産生一個使用的GUID,可以使用GUID 産生的工具,例如Guidgen.exe
hBalloonIcon
Windows Vista and later. 應用程式提供的自定義圖示的句柄在通知區域的圖示應該被獨立使用。如果這個成員變量是非空的并且在成員變量dwInfoFlags 中設定了NIIF_USER 标志,那麼這個圖示作為通知圖示。如果這個成員變量是NULL,那麼預設的行為将被實行
備注
在Windows User Experience Interaction Guidelines 的notification UI 和 content best practices子產品檢視更多關于
Notifications的資訊
如果成員變量uFlags 的值為 NIF_INFO,那麼氣泡樣式的通知被使用。請檢視
Balloon tooltips獲得更加關于這些通知的讨論
在工作列不能同時顯示超過一個的氣泡資訊。如果應用程式的一個通知已經顯示此時你試圖再去顯示另外一個通知,那麼第二個通知将會排在第一個通知之後直到第一個通知顯示結束才會顯示第二個通知。如果是Windows Vista 之前的系統那麼第二個通知将會在第一個通知被顯示系統預設的最小時間長度之後顯示而不管第一個通知被設定的時間是值的大小。如果使用者不使用計算機,系統不算上這一次逾時。
Windows 2000 and later 之後的系統将不支援這個結構體的多個成員變量,如果想要使用這些成員需要添加以下頭檔案:
1 // Windows Vista and later:
2
3 #define NTDDI_VERSION NTDDI_WIN2K
4
5 #define NTDDI_VERSION NTDDI_WINXP
6
7 #define NTDDI_VERSION NTDDI_VISTA
8
9 // Windows XP and earlier:
10
11 #define _WIN32_IE 0x0500
注意你必須使用這個結構體的大小去初始化這個結構體。如果你使用目前定義的結構體的大小,這個應用程式在早期的Shell32.dll 中很可能不會運作,因為它需要一個更小的結構體。你可以在早期的Shell32.dll 中運作你的應用程式通過定義恰當的版本号(請看
Shell and Common Controls Versions)。但是如果你想要在最新的系統上運作很可能會導緻問題
你可以讓目前的應用程式與Shell32.dll 的版本相容同時仍然使用目前的頭檔案通過設定NOTIFYICONDATA 結構體的大小。在你初始化結構體之前,使用
DllGetVersion去确定在你的系統上Shell32.dll 使用的是哪個版本并且使用以下的值初始化 cbSize:
Shell32.dll Version | |
6.0.6 or higher (Windows Vista and later) | sizeof(NOTIFYICONDATA) |
6.0 (Windows XP) | NOTIFYICONDATA_V3_SIZE |
5.0 (Windows 2000) | NOTIFYICONDATA_V2_SIZE |
Versions lower than 5.0 | NOTIFYICONDATA_V1_SIZE |
表01
讓cbSize 使用以上表格的值将允許你的應用程式在早期的Shell32.dll版本中去使用NOTIFYICONDATA
以下的代碼展示了通過版本檢查使成員變量guidItem 能夠在Windows Vista 和 Windows 7 上運作。在Windows 7 系統下将會傳回
TRUE。guiditem成員必須設定為0,除非該成員的傳回TRUE。
注意:此代碼是特定于Windows 7的版本号。可以預期的是,Windows和Windows server的未來版本将支援成員變量guiditem,同時這個代碼也必須更新去識别之後的版本
1 BOOL IsWin7OrLater()
2
3 {
4
5 // 初始化OSVERSIONINFOEX structure.
6
7 OSVERSIONINFOEX osvi;
8
9 ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
10
11 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
12
13 osvi.dwMajorVersion = 6;
14
15 osvi.dwMinorVersion = 1;
16
17 // Initialize the condition mask.
18
19 DWORDLONG dwlConditionMask = 0;
20
21 VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
22
23 VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
24
25 // 執行測試.
26
27 return VerifyVersionInfo(&osvi,
28
29 VER_MAJORVERSION | VER_MINORVERSION,
30
31 dwlConditionMask);
32
33 }
以下代碼例子顯示使用
加載高DPI的圖示
1 // 定義 NOTIFYICONDATA 細節.
2
3 // 錯誤處理是這裡省略簡潔。不要在你的代碼忽略它
4
5 NOTIFYICONDATA nid = {};
6
7 nid.cbSize = sizeof(nid);
8
9 nid.hWnd = hWnd;
10
11 nid.uFlags = NIF_ICON | NIF_TIP | NIF_GUID;
12
13 // 注:這是一個例子,而不應隻使用GUID.
14
15 // 通常情況下,你應該使用一個GUID生成工具提供的值
16
17 // 給guiditem指派
18
19 static const GUID myGUID =
20
21 {0x23977b55, 0x10e0, 0x4041, {0xb8, 0x62, 0xb1, 0x95, 0x41, 0x96, 0x36, 0x69}};
22
23 nid.guidItem = myGUID;
24
25 // 以下文本将作為工具提示的顯示文本
26
27 StringCchCopy(nid.szTip, ARRAYSIZE(nid.szTip), L"Test application");
28
29 // 加載一個高DPI 的圖示
30
31 LoadIconMetric(hInst, MAKEINTRESOURCE(IDI_SMALL), LIM_SMALL, &(nid.hIcon));
32
33 // 顯示通知
34
35 Shell_NotifyIcon(NIM_ADD, &nid) ? S_OK : E_FAIL;
故障處理
如果你使用成員變量guidItem 去識别你的圖示但是這個圖示不被看見或者調用
失敗,以下可能就是原因:
- 在Shell_NotifyIcon使用這個NIF_GUID 标志沒有被設定。如果你識别出擁有GUID 的圖示調用了函數
- 二進制檔案中包含的圖示被移除。這個二進制檔案的路徑包含了圖示GUID 的注冊資訊并且這個注冊資訊是不能被改變的。與圖示關聯的設定被儲存僅當檔案路徑和GUID是不變的。如果檔案的路徑必須被改變那麼應用程式必須移除所有圖示注冊時添加的GUID 資訊。一旦所有的資訊被移除你就可以移動二進制檔案到新的位置并且注冊一個新的GUID。任何的與原始注冊的GUID 關聯的設定将會丢失
這也是一個并排安裝時發生。當處理一個并排安裝,新版本的應用程式需要更新的二進制檔案的GUID。
注意:一種移動檔案的唯一的例外發生是原有的移動二進制檔案都由同一家公司簽署的Authenticode。在這種情況下,設定是通過移動保留。
必要條件
Minimum supported client | Windows XP [desktop apps only] |
Minimum supported server | Windows 2000 Server [desktop apps only] |
Header | Shellapi.h |
表 02
Shell_NotifyIcon function
發送一個消息到工作列狀态區域
函數原型
BOOL Shell_NotifyIcon(
_In_ DWORD dwMessage,
_In_ PNOTIFYICONDATA lpdata
);
參數說明
dwMessage [in]
指定這個函數所采取的行動的值。它可以是以下的值:
NIM_ADD (0x00000000):在托盤區域添加一個圖示。這個圖示在結構體
NOTIFYICONDATA中被指出
NIM_MODIFY (0x00000001):修改在托盤區域的圖示。
需要修改的圖示在結構體NOTIFYICONDATA中被指出
NIM_DELETE (0x00000002):删除在托盤區域的圖示。需要删除的圖示在
結構體NOTIFYICONDATA中被指出
NIM_SETFOCUS (0x00000003):
Shell32.dll version 5.0 and later only。通知區域應該使用這個消息當它們完成對UI 的操作後。例如,當圖示顯示一個快捷菜單而使用者使用ESC 鍵去取消它,那麼我們應該使用NIM_SETFOCUS 将焦點傳回給通知區域
NIM_SETVERSION (0x00000004):
。指令通知區域要根據結構體NOTIFYICONDATA 中指出的版本号去執行指令。這個版本号必須是正确有效的
當通知區域的圖示被添加(NIM_ADD)時NIM_SETVERSION每次都必須被調用。并不需要調用NIM_MOFIDY。一旦使用者退出這個版本并不會保持。更多的細節請看備注部分
lpdata [in]
Type: PNOTIFYICONDATA
指向結構體
的指針。這個結構的内容取決于dwmessage 的值。它可以定義一個圖示添加到通知區域,使圖示顯示一個通知,或識别一個圖示修改或删除。
Return value
Type: BOOL
如果成功傳回TRUE,否則傳回 FALSE。如果dwmessage設定為NIM_SETVERSION且版本已成功更改,函數傳回TRUE,如果請求的版本不支援則傳回FALSE。
Windows 2000 (
Shell32.dll version 5.0)系統下,如果你設定結構體
的成員變量 uVersion NOTIFYICON_VERSION_4 或者更高,那麼Shell_NotifyIcon 的滑鼠與鍵盤消息事件的處理與早些版本的Windows 是不同的。具體的不同如下所示:
- 如果使用者選擇使用鍵盤彈出通知圖示的快捷菜單那麼程式将會發送一個 WM_CONTEXTMENU 消息。在早期的版本中将會發送 WM_RBUTTONDOWN 和 WM_RBUTTONUP 消息
- 如果使用者使用鍵盤的SPACEBAR 或者 ENTER 鍵去選擇通知圖示那麼如果程式的版本是6.0,那麼将會發送一個NIN_KEYSELECT 通知。早期版本 将會發送
- 如果使用者使用滑鼠去選擇通知圖示而使用鍵盤的Enter 鍵去激活它,那麼程式會發送NIN_SELECT 通知。早期版本将會發送
對于Windows XP (
Shell32.dll version 6.0)系統,如果使用者如果使用者将滑鼠指針放在其中一個氣球通知相關的圖示,shell發送以下資訊:
- NIN_BALLOONSHOW:氣泡顯示的發送(氣泡被排序)
- NIN_BALLOONHIDE:氣泡消息的時候發送。例如,當一個圖示被删除,這個消息不會被發送如果氣泡被因為逾時或者滑鼠點選被駁回
在Windows 7系統上,NIN_BALLOONHIDE會被發送當被設定了
NIIF_RESPECT_QUIET_TIME标志的通知試圖在“quiet time”(使用者在新電腦上的第1個小時)時顯示,在這種情況下,這個氣泡将不會被使用。
- NIN_BALLOONTIMEOUT:當氣泡因為逾時被駁回的時候發送
- NIN_BALLOONUSERCLICK.:當氣泡因為滑鼠點選被駁回的時候
在Windows Vista (Shell32.dll version 6.0.6)上,如果使用者将滑鼠指針放在其中一個氣球通知相關的圖示,Windows Vista外殼還增加了以下資訊:
- NIN_POPUPOPEN:當使用者在圖示上懸浮表明一個豐富的彈出式UI應該被使用而不是文本工具提示,此時這個消息會被發送
- NIN_POPUPCLOSE:當滑鼠不在圖示上懸浮表明彈出菜單應該被關閉,此時這個消息被發送
不管是什麼作業系統的版本,你可以選擇Shell 的運作方式通過調用函數Shell_NotifyIcon 并設定dwMessage 的值為NIM_SETVERSION。給結構體
的成員變量uVersion 合适的指派來表明你希望使用Windows 2000, Windows Vista, 或者 pre-version 5.0 (Windows 95) 的操作
注:以上并沒有商量自定義的Windows 消息。當調用函數Shell_NotifyIcon 并将dwMessage設定為NIM_ADD 那麼自定義的消息将會被發送給
結構體中的uCallbackMessage 指定的函數進行處理
在 Windows XP Service Pack 2 (SP2)系統上,一個自定義的圖示能夠在通知氣泡上顯示。這允許呼叫處理定制通知以外的資訊,警告,以前可用的選項和錯誤,并差別于其他類型的使用者的通知。
Library | Shell32.lib |
DLL | Shell32.dll (version 4.0 or later) |
Unicode and ANSI names | Shell_NotifyIconW (Unicode) and Shell_NotifyIconA (ANSI) |
表 03
具體執行個體
在CStudentDlg.h 檔案中添加如下代碼:
1 #define WM_SHOWTASKICON WM_USER + 4
2 #define IDM_SHOW_WINDOW WM_USER + 5
3 // CStudentDlg 對話框
4 class CStudentDlg : public CDialogEx
5 {
6 protected:
7 // 添加托盤消息響應
8 afx_msg LRESULT OnShowTaskIcon(WPARAM wParam, LPARAM lParam);
9 // 菜單項單擊"顯示"響應函數
10 afx_msg void OnShowDlg();
11 private:
12 // 添加一個類成員變量
13 NOTIFYICONDATA m_notifyIconData; // 托盤
14 }
在CStudentDlg.cpp 的BEGIN_MESSAGE_MAP 下添加如下代碼:
1 BEGIN_MESSAGE_MAP(CStudentDlg, CDialogEx)
2 ON_MESSAGE(WM_SHOWTASKICON, &CStudentDlg::OnShowTaskIcon)
3 ON_COMMAND(IDM_SHOW_WINDOW, &CStudentDlg::OnShowDlg)
4 END_MESSAGE_MAP()
在CStudentDlg.cpp 檔案下添加如下函數:
1 // 初始化NOTIFYICONDATA 結構體
2 void CStudentDlg::InitPrompt(void)
3 {
4 // 設定托盤圖示
5 m_notifyIconData.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
6 m_notifyIconData.hWnd = m_hWnd;
7 // 你添加的圖示的屬性ID
8 m_notifyIconData.uID = IDR_MAINFRAME;
9 m_notifyIconData.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
10 m_notifyIconData.uCallbackMessage = WM_SHOWTASKICON; // 自定義托盤菜單消息
11 // 加載資源icon
12 m_notifyIconData.hIcon = ::LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
13 wcscpy(m_notifyIconData.szTip, _T("*****系統"));
14 Shell_NotifyIcon(NIM_ADD, &m_notifyIconData); // 在托盤區添加圖示
15 }
16
17 // 托盤菜單消息函數
18 LRESULT CStudentDlg::OnShowTaskIcon(WPARAM wParam, LPARAM lParam)
19 {
20 if(wParam != IDR_MAINFRAME) // 判斷圖示ID是否相符
21 return 1;
22 switch(lParam)
23 {
24 case WM_RBUTTONUP:
25 {// 按滑鼠右鍵
26 CPoint point;
27 GetCursorPos(&point);
28 CMenu menu;
29 menu.CreatePopupMenu();
30 menu.AppendMenu(MF_STRING, IDM_SHOW_WINDOW, _T("顯示"));
31 menu.AppendMenu(MF_STRING, WM_DESTROY, _T("退出"));
32 SetForegroundWindow(); // 解決菜單失去焦點不消失的BUG
33 menu.TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);
34 menu.DestroyMenu();
35 }
36 break;
37 case WM_LBUTTONDBLCLK: // 輕按兩下滑鼠左鍵
38 OnShowDlg();
39 break;
40 }
41 return 0;
42 }
43
44 // 托盤菜單"顯示"響應函數
45 void CStudentDlg::OnShowDlg()
46 {
47 if(IsWindowVisible())
48 SendMessage(WM_SYSCOMMAND, SC_RESTORE, (LPARAM)m_hWnd);
49 else
50 ShowWindow(SW_SHOW);
51 }
52
53 // 重寫視窗消息處理函數,來攔截MFC視窗“最小化”按鈕點選消息響應讓程式最小化到托盤
54 LRESULT CStudentDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
55 {
56 // TODO: 在此添加專用代碼和/或調用基類
57
58 // 單擊最小化按鈕
59 if (message == WM_SYSCOMMAND &&
60 wParam == SC_MINIMIZE)
61 {
62 //AfxMessageBox(_T("是否最小化視窗到托盤"));
63 ShowWindow(SW_HIDE); // 隐藏主視窗
64 return 0;
65 }
66 return CDialog::DefWindowProc(message, wParam, lParam);
67 }
2015-04-21 17:02:48