我创建了一个系统托盘图标:
BOOL TrayMessage(HWND hWnd, DWORD dwMessage)
{
NOTIFYICONDATA nid;
nid.cbSize = sizeof(nid);
nid.hWnd = hWnd;
nid.uID = 1;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nid.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_MYAPP));
lstrcpy(nid.szTip, L"MyApp");
nid.uCallbackMessage = WM_NOTIFYICON;
return Shell_NotifyIcon(dwMessage, &nid);
}
当应用程序启动/创建窗口时:
case WM_CREATE:
if (!TrayMessage(hWnd, NIM_ADD))
MessageBox(hMainWnd, L"Tray error.", 0, 0);
此错误消息框:
当我正常启动 .exe 时永远不会发生。
仅在用户注销/用户重新登录后发生,平均每 5 次启动一次(我的应用程序会在每次会话启动时自动启动 TaskSchedular 任务)
当然,当错误发生时,图标不会显示在任务栏中。
可能是什么原因?
系统托盘系统还没有准备好(用户注销/再次登录后很短)?
任务栏本身还没准备好?
我应该把创作移到外面的某个地方
WM_CREATE吗?
编辑:@RbMm 发表评论后,我尝试了这个:
case WM_CREATE:
TrayMessage(hWnd, NIM_ADD);
// I removed MessageBox(...) from here
uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
...
break;
default:
if (message == uTaskbarRestart)
{
TrayMessage(hWnd, NIM_ADD);
MessageBox(hMainWnd, L"TaskbarRestart", 0, 0);
}
本次测试的结果:托盘图标无法显示的情况正是MessageBoxTaskbarRestart没有显示的情况,即TaskbarRestart事件从不进入消息循环的情况......这很奇怪......
注意:这仅在用户注销/重新登录后发生。