2011-07-17 136 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

相关问题