В настоящее время я работаю над приложением 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 …
Есть несколько причин, почему исчезает значок на панели задач.
HWND, связанный с иконой, был уничтожен.
В современных версиях Windows значок был скрыт от просмотра пользовательскими настройками вне контроля вашего приложения.
Windows Explorer завис и перезапустился, но вы не справились с TaskbarCreated
сообщение для повторного добавления вашего значка.
редактировать: Другая возможность заключается в том, что вы просто передаете неверный ввод Shell_NotifyIcon()
и это терпит неудачу с ошибкой, которую вы игнорируете.
Это, скорее всего, предполагаемое поведение. Windows 7 (и более поздние версии) очень агрессивны в отношении не всегда отображения значков уведомлений, потому что они подвергаются и подвергаются жестокому обращению. Их намерение состояло, как следует из названия, в предоставлении уведомлений и ничего более.
API не гарантирует, что ваш значок будет виден. Это только позволяет вам зарегистрироваться, что вы хотели бы сделать уведомление. ОС должна решить, должно ли отображаться это уведомление и как долго.
Если вы перейдете к значкам области уведомлений на панели управления, вы увидите настройки, которые применяются к каждому значку. Скорее всего, у вас установлено либо «Скрыть значок и уведомления», либо «показывать только уведомления».
И нет, вы ничего не можете с этим поделать, кроме как попросить пользователя разрешить ваш значок. Еще раз, API для доставки уведомлений, и если пользователь не хочет видеть ваш значок или ваше уведомление, ОС уважает это.
Из документации уведомления на 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