Удаление иконки из трея - PullRequest
       39

Удаление иконки из трея

2 голосов
/ 08 ноября 2011

Использование приведенного ниже кода приводит к тому, что иногда значок остается в области сразу после вызова метода removeIconFromTray и исчезает только после того, как пользователь перемещается по значку в области уведомлений.

void CMyDlg::addIconToTray()
{
    static HICON hIcon = ::LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON));
    NOTIFYICONDATA data;

    data.cbSize = sizeof(data);
    data.hIcon = hIcon;
    data.hWnd = m_hWnd;
    strcpy (data.szTip, m_sTrayIconTip.c_str());
    data.uFlags = NIF_ICON | NIF_TIP;
    data.uID = (UINT)this;

    Shell_NotifyIcon (NIM_ADD, &data);
}

void CMyDlg::removeIconFromTray()
{
    NOTIFYICONDATA data;

    data.cbSize = sizeof(data);
    data.hWnd = m_hWnd;
    data.uID = (UINT)this;

    Shell_NotifyIcon (NIM_DELETE, &data);

}

этот код и как добиться того, чтобы иконка исчезла из трея, как только код, удаляющий его из формы там закончил работать?

Ответы [ 3 ]

1 голос
/ 08 ноября 2011

Одна очевидная проблема заключается в том, что вы не можете инициализировать вашу структуру. Вы должны сделать это:

NOTIFYICONDATA data = { 0 };

Кроме того, проверьте наличие ошибок и вызовите GetLastError, чтобы выяснить причину ошибки.

0 голосов
/ 04 апреля 2015

Как сказал DavidHeffernan, вы должны инициализировать ноль вашей data структуры (вы должны ВСЕГДА начинать с нуля любую структуру, которую вы передаете в функцию Win32 API), например:

NOTIFYICONDATA data = {0};

Или:

NOTIFYICONDATA data;
ZeroMemory(&data, sizeof(data));

Таким образом, любые неиспользуемые поля имеют согласованные и предсказуемые значения.В вашем случае, когда вы вызываете NIM_DELETE, вы не инициализируете data, поэтому его поле uFlags будет содержать случайные биты, что может привести к неправильной интерпретации Shell_NotifyIcon() содержимого вашего NOTIFYICONDATA и к ошибке, иТаким образом, ваша иконка не удаляется.

0 голосов
/ 04 апреля 2015

По данным MSDN:

Функция Shell_NotifyIcon

Удаляет значок из области состояния. Структура NOTIFYICONDATA, на которую указывает lpdata, использует идентификатор, изначально назначенный значку, когда он был добавлен в область уведомлений (NIM_ADD), для идентификации значка, который нужно удалить.

Итак, вы должны передать те же данные NOTIFYICONDATA в функцию Shell_NotifyIcon.

void CMyDlg::addIconToTray()
{
    static HICON hIcon = ::LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON));
    NOTIFYICONDATA data;

    data.cbSize = sizeof(data);
    data.hIcon = hIcon;
    data.hWnd = m_hWnd;
    strcpy (data.szTip, m_sTrayIconTip.c_str());
    data.uFlags = NIF_ICON | NIF_TIP;
    data.uID = (UINT)this;

    Shell_NotifyIcon (NIM_ADD, &data);
}

void CMyDlg::removeIconFromTray()
{
    NOTIFYICONDATA data;

    data.cbSize = sizeof(data);
    data.hIcon = hIcon;
    data.hWnd = m_hWnd;
    strcpy (data.szTip, m_sTrayIconTip.c_str());
    data.uFlags = NIF_ICON | NIF_TIP;
    data.uID = (UINT)this;

    Shell_NotifyIcon (NIM_DELETE, &data);

}

Это будет работать правильно. Или сохраните данные в переменной-члене.

...