2011-07-17 39 views
5

我希望我的應用程序在Windows 7的通知區域中有圖標。我使用Shell_NotifyIcon添加圖標。圖標出現,但當我將鼠標指針放在圖標上時,圖標消失。該應用程序正在運行整個時間。該圖標不隱藏,它只是消失。添加到通知托盤的圖標在鼠標上消失

Shell_NotifyIcon返回一個非零值,這意味着它成功。

下面是相關代碼:

static const int ID_TRAYICON = 300; 
static const int MSG_TRAYICON = WM_USER + 1; 
NOTIFYICONDATA nid; 
void InitTrayIconData() 
{ 
    memset(&nid, 0, sizeof(NOTIFYICONDATA)); 

    nid.cbSize = sizeof(NOTIFYICONDATA); 
    nid.hWnd = hwnd; 
    nid.uID = ID_TRAYICON; 
    nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; 
    nid.uCallbackMessage = MSG_TRAYICON; 
    nid.hIcon = LoadIcon(nullptr, IDI_APPLICATION); 
    //nid.uVersion = NOTIFYICON_VERSION_4; 
    lstrcpy(nid.szTip, TEXT("Data Aggregator in-dev version")); 
} 

然後在處理WM_CREATE消息:

InitTrayIconData(); 
Shell_NotifyIcon(NIM_ADD, &nid); 

而且在處理WM_DESTROY:

Shell_NotifyIcon(NIM_DELETE, &nid); 

我也注意到,對於一些因爲MSG_TRAYICON消息從未被調用。

回答

6

我想通了。當我在WM_CREATE中調用InitTrayIconData()時,全局hwnd還沒有被賦予CreateWindowEx返回的值(WM_CREATE消息在CreateWindowEx調用後沒有被髮送,但是在它之間,我不知道)。因此,線,

nid.hWnd = hwnd; 

只是等同nid.hWnd到nullptr(這是我已經初始化HWND到)。

我通過將WndProc中的hwnd參數傳遞給InitTrayIconData()來修復問題,因此它將使用該hwnd而不是全局hwnd。

+1

我有完全相同的問題,謝謝指出我在正確的方向。 – quantum

5

當系統無法與擁有通知圖標的應用程序通信時,會發生這種情況。

通常這是因爲進程異常終止。在你的情況下,你聲明整個過程都在運行。因此,我只能斷定與通知​​圖標關聯的窗口句柄已被銷燬,或者沒有正確響應消息。該診斷也符合你的觀察,即你沒有收到MSG_TRAYICON