Значок, добавленный в панель уведомлений, исчезает при наведении мыши - PullRequest
5 голосов
/ 17 июля 2011

Я хочу, чтобы у моего приложения был значок в области уведомлений в 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"));
}

Затем при обработке сообщения WM_CREATE:

InitTrayIconData();
Shell_NotifyIcon(NIM_ADD, &nid);

И при обработке WM_DESTROY:

Shell_NotifyIcon(NIM_DELETE, &nid);

Я также заметил, что по какой-то причине сообщение MSG_TRAYICON никогда не вызывается.

Ответы [ 2 ]

8 голосов
/ 17 июля 2011

Я понял это.Когда я вызывал InitTrayIconData () в WM_CREATE, глобальному hwnd еще не было присвоено значение, возвращаемое из CreateWindowEx (сообщение WM_CREATE было отправлено не после вызова CreateWindowEx, но во время него, которого я не знал).Таким образом, строка

nid.hWnd = hwnd;

просто приравнивает nid.hWnd к nullptr (к чему я инициализировал hwnd).

Я исправил проблему, передав аргумент hwnd в WndProc вInitTrayIconData (), поэтому он будет использовать этот hwnd вместо глобального hwnd.

5 голосов
/ 17 июля 2011

Это происходит, когда система не может связаться с приложением, которому принадлежит значок уведомления.

Обычно это происходит из-за ненормального завершения процесса.В вашем случае вы утверждаете, что процесс выполняется все время.Таким образом, я могу только сделать вывод, что дескриптор окна, связанный со значком уведомления, был уничтожен или неправильно отвечает на сообщения.Этот диагноз также соответствует вашему наблюдению, что вы не получили MSG_TRAYICON.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...