Win32 API,系统托盘图标消失

时间:2014-05-25 17:53:58

标签: c++ winapi system-tray

我目前正在开发Win32应用程序,我想在系统任务栏中有一个图标。我正在使用Shell_NotifyIcon来显示图标,而且效果很好但是图标通常没有解释就消失了......

实际上,在构建代码之后我第一次在Visual Studio 2013中运行代码时,或者当我从另一个目录中的.exe运行应用程序时出现错误(我没有任何错误) missing dll并且应用程序正在运行,但图标不再存在......)。

我用来创建图标的代码:

// At the beginning of the file
static NOTIFYICONDATA m_nid ;

// After
m_nid.cbSize = sizeof (m_nid);
m_nid.hWnd = hwnd;
m_nid.uVersion = NOTIFYICON_VERSION_4 ;
static const GUID myGUID =
{0x5CA81ADA, 0xA481, 0x4BA8, {0x8B, 0x70, 0x80, 0x3f, 0x48, 0x67, 0xA1, 0x68}};
m_nid.guidItem = myGUID;

m_nid.uFlags = NIF_ICON | NIF_TIP | NIF_GUID | NIF_MESSAGE ;
m_nid.uCallbackMessage = WM_SYSTEM_TRAY;
StringCchCopy (m_nid.szTip, ARRAYSIZE (m_nid.szTip), NotificationManager::APPLICATION_NAME.c_str ());
m_nid.hIcon = (HICON) LoadImage (NULL, L"icon_v1.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);

ShowWindow (m_nid.hWnd, SW_HIDE);
Shell_NotifyIcon (NIM_ADD, &m_nid);
Shell_NotifyIcon (NIM_SETVERSION, &m_nid);

修改:我认为这是GUID的问题,因为在Release模式下图标没有显示,但是因为我更改了GUID它的工作正常...但是当我在Visual Studio之外运行程序时,它仍然不起作用......

3 个答案:

答案 0 :(得分:3)

系统托盘图标消失的原因有多种。

  1. 与图标相关联的HWND已被销毁。

  2. 在现代Windows版本中,图标已被应用程序控制范围之外的用户设置隐藏起来。

  3. Windows资源管理器崩溃并重新启动,但您没有处理TaskbarCreated消息以重新添加图标。

  4. 编辑:另一种可能性是你只是将错误的输入传递给Shell_NotifyIcon()而且它失败并且你忽略了一个错误。

答案 1 :(得分:2)

这很可能是预期的行为。 Windows 7(及更高版本)非常咄咄逼人,并不总是显示通知图标,因为它们受到严重滥用。顾名思义,他们打算提供通知,而不是别的。

API不保证您的图标可见。它只允许您注册您想要发出通知。由操作系统决定是否应该显示该通知以及持续​​多长时间。

如果您进入“控制面板”中的“通知区域图标”,则可以看到应用于每个图标的设置。最有可能的是,您的设置为“隐藏图标和通知”,或“仅显示通知”。

不,除了要求用户允许你的图标之外,你无能为力。 API再次用于发送通知,如果用户不想看到您的图标或通知,操作系统会尊重这一点。

答案 2 :(得分:0)

来自msdn上的通知文档我看到了:

> Each icon in the notification area can be identified in two ways:
> 
>     The GUID with which the icon is declared in the registry. This is the preferred method on Windows 7 and later.
>     The handle of a window associated with the notification area icon, plus an application-defined icon identifier. This method is used on
> Windows Vista and earlier.

这里的链接也是: http://msdn.microsoft.com/en-us/library/windows/desktop/ee330740%28v=vs.85%29.aspx