Win32 API, значок в системном трее исчезает

В настоящее время я работаю над приложением 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 …

2

Решение

Есть несколько причин, почему исчезает значок на панели задач.

  1. HWND, связанный с иконой, был уничтожен.

  2. В современных версиях Windows значок был скрыт от просмотра пользовательскими настройками вне контроля вашего приложения.

  3. Windows Explorer завис и перезапустился, но вы не справились с TaskbarCreated сообщение для повторного добавления вашего значка.

редактировать: Другая возможность заключается в том, что вы просто передаете неверный ввод Shell_NotifyIcon() и это терпит неудачу с ошибкой, которую вы игнорируете.

3

Другие решения

Это, скорее всего, предполагаемое поведение. Windows 7 (и более поздние версии) очень агрессивны в отношении не всегда отображения значков уведомлений, потому что они подвергаются и подвергаются жестокому обращению. Их намерение состояло, как следует из названия, в предоставлении уведомлений и ничего более.

API не гарантирует, что ваш значок будет виден. Это только позволяет вам зарегистрироваться, что вы хотели бы сделать уведомление. ОС должна решить, должно ли отображаться это уведомление и как долго.

Если вы перейдете к значкам области уведомлений на панели управления, вы увидите настройки, которые применяются к каждому значку. Скорее всего, у вас установлено либо «Скрыть значок и уведомления», либо «показывать только уведомления».

И нет, вы ничего не можете с этим поделать, кроме как попросить пользователя разрешить ваш значок. Еще раз, API для доставки уведомлений, и если пользователь не хочет видеть ваш значок или ваше уведомление, ОС уважает это.

2

Из документации уведомления на 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

0
По вопросам рекламы [email protected]