我希望我的应用程序在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"));
}
Run Code Online (Sandbox Code Playgroud)
然后在处理WM_CREATE消息时:
InitTrayIconData();
Shell_NotifyIcon(NIM_ADD, &nid);
Run Code Online (Sandbox Code Playgroud)
在处理WM_DESTROY时:
Shell_NotifyIcon(NIM_DELETE, &nid);
Run Code Online (Sandbox Code Playgroud)
我还注意到,由于某种原因,永远不会调用MSG_TRAYICON消息.
我想到了.当我在WM_CREATE中调用InitTrayIconData()时,还没有为全局hwnd分配从CreateWindowEx返回的值(在CreateWindowEx调用之后没有发送WM_CREATE消息,但是在它期间,我不知道).所以这条线,
nid.hWnd = hwnd;
Run Code Online (Sandbox Code Playgroud)
将nid.hWnd等同于nullptr(这是我初始化hwnd的原因).
我通过将WndProc中的hwnd参数传递给InitTrayIconData()来解决问题,因此它将使用该hwnd而不是全局hwnd.
当系统无法与拥有通知图标的应用程序通信时,会发生这种情况.
通常这是因为该过程异常终止.在您的情况下,您声明该进程一直在运行.因此,我只能得出结论,与通知图标关联的窗口句柄已被破坏,或者没有正确响应消息.这种诊断也与您未接受的观察相符MSG_TRAYICON.
| 归档时间: |
|
| 查看次数: |
3747 次 |
| 最近记录: |