powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как убрать лишние значки после перезапуска приложения?
14 сообщений из 14, страница 1 из 1
Как убрать лишние значки после перезапуска приложения?
    #39497470
Abejon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перезапускать приложение я научился, но теперь возникла другая проблема: после каждого перезапуска в трее остаётся иконка, и в итоге их накапливается очень много.
При наведении курсора на иконку она исчезает, если не связана с активным приложением, а как убрать программно такую иконку, чтобы не пугать пользователя их обилием?
...
Рейтинг: 0 / 0
Как убрать лишние значки после перезапуска приложения?
    #39497478
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перезапускать надо по-человечески, т.е. посылать приложению WM_QUIT, а не убивать процесс.
...
Рейтинг: 0 / 0
Как убрать лишние значки после перезапуска приложения?
    #39497493
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Abejonа как убрать программно такую иконку, чтобы не пугать пользователя их обилием?А как ты её туда добавил? Той же функцией она и убирается.
...
Рейтинг: 0 / 0
Как убрать лишние значки после перезапуска приложения?
    #39497516
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AbejonПерезапускать приложение я научился, но теперь возникла другая проблема: после каждого перезапуска в трее остаётся иконка, и в итоге их накапливается очень много.
При наведении курсора на иконку она исчезает, если не связана с активным приложением, а как убрать программно такую иконку, чтобы не пугать пользователя их обилием?
Перед тем как завершишь работу приложения:

Код: plaintext
1.
2.
3.
4.
NOTIFYICONDATA	nid	= {0};	
nid.cbSize		= sizeof(NOTIFYICONDATA);
nid.hWnd		= m_hWnd;		// окно принимающее сообщения от трея
::Shell_NotifyIcon(NIM_DELETE, &nid);
...
Рейтинг: 0 / 0
Как убрать лишние значки после перезапуска приложения?
    #39497656
Abejon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TПерезапускать надо по-человечески, т.е. посылать приложению WM_QUIT, а не убивать процесс.
Не помогает WM_QUIT.
...
Рейтинг: 0 / 0
Как убрать лишние значки после перезапуска приложения?
    #39497661
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AbejonDima TПерезапускать надо по-человечески, т.е. посылать приложению WM_QUIT, а не убивать процесс.
Не помогает WM_QUIT.
Иконка в трее остается при убивании процесса, т.е. при некорректном завершении процесса. Разбирайся с ним, как его корректно остановить, чтобы он нормально завершился, а не был убит извне.
Если ты постоянно его так убиваешь, то обязательно вылезут проблемы из-за такого "перезапуска".
...
Рейтинг: 0 / 0
Как убрать лишние значки после перезапуска приложения?
    #39497711
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИконка в трее остается при убивании процесса, т.е. при некорректном завершении процесса.Не, трей - это отдельная шеловская фигня со своим API, она за процессами сама не следит. Поэтому кто иконку в трей положил, тот её оттуда должен и убрать
...
Рейтинг: 0 / 0
Как убрать лишние значки после перезапуска приложения?
    #39497972
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, согласен с тем, что обязательно надо делать
Код: vbnet
1.
Shell_NotifyIcon(NIM_DELETE, nid)


чтобы убрать иконку из трея (и не важно, "убиваете" ли вы процесс или корректно выгружаете).

Там еще есть ньюанс.
Процесс Explorer может внезапно себя перегрузить, в этом случае иконка в трее не самовосстанавливается.
У меня этот вопрос решен таймером (1 с), который "обновляет" иконку (т.е. в указанном случае она восстановится).
Не самое красивое возможно, но вполне рабочее решение (заодно этот код может менять иконку на другую).
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  Private Sub ChangeTrayIcon(ByVal m_icon As Icon)
    'код вывода иконки в трей
    Dim nid As New NOTIFYICONDATA
    With nid
      .cbSize = IIf(sys_WinVista, Marshal.SizeOf(nid), Marshal.SizeOf(nid) - IntPtr.Size) 'NOTIFYICONDATA_V3_SIZE для XP
      .hWnd = Me.Handle
      .uID = vbNull
      .uFlags = NIF_ICON
      .hIcon = m_icon.Handle
    End With
    Shell_NotifyIcon(NIM_MODIFY, nid) 'меняем/обновляем иконку в трее
  End Sub


Sorry за VB.Net (пишу в основном на нем), но смысл понятен.
...
Рейтинг: 0 / 0
Как убрать лишние значки после перезапуска приложения?
    #39498072
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77меня этот вопрос решен таймером (1 с)
Можно подписаться на специальное событие:
Код: plaintext
1.
uTaskbarRestartMsg = RegisterWindowMessage(TEXT("TaskbarCreated"));

И ловить его у себя в WndProc основного окна:
Код: plaintext
1.
2.
3.
4.
if(message == uTaskbarRestartMsg)
{
// Shell_NotifyIcon(заново);
}
...
Рейтинг: 0 / 0
Как убрать лишние значки после перезапуска приложения?
    #39498139
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

>uTaskbarRestartMsg = RegisterWindowMessage(TEXT("TaskbarCreated"));

Давно это все писалось, в основном еще на VB6, в таких вещах тогда еще мог плавать.

Хотя продвинулся неплохо. Это все и на Win10 по сей день прекрасно работает.
(иконки только в новых Tray Notifications на Win10 чуть больше чем 32, поэтому чуть мажутся при растягивании, но не критично, но я не нашел в MSDN новой документации по этому вопросу )

http://www.sql.ru/forum/actualsearch.aspx?search=Shell_NotifyIcon&sin=0&bid=34&bid=22&a=&ma=0&dt=-1&s=1&so=1


Здесь например возился с Custom-тултипами при наведении на иконку (картинка+ текст, типа тех что были модны на Висте)
Помогите со стилем Tooltip "на Висте" (картинка+Title+Text но не Ballon)

Там еще важна версия структуры, чтоб все фишки работали. На >=Vista это Version 4, на XP - Version 3.

Но при случае совет учту.
Хотя и "таймер" мой без нареканий работает.
...
Рейтинг: 0 / 0
Как убрать лишние значки после перезапуска приложения?
    #39498180
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77иконки только в новых Tray Notifications на Win10 чуть больше чем 32, поэтому чуть мажутся при растягивании, но не критично, но я не нашел в MSDN новой документации по этому вопросу )Надо смотреть доку по типу окна, который используется в трее, я сейчас у себя в 7-ке спаем посмотрел - там ToolbarWindow32 (в 10-ке скорее всего тоже самое), соответственно, shell-овские функции скорее всего просто передают ресурсы в функции работы с тулбаром, и там работают те же правила, что в тулбаре. Насколько помню, достаточно в иконке иметь инстранс больше, чем требуемый размер, тогда оно пожмёт иконку до требуемого размера (возможно, важен порядок инстансов), и всё будет нормально.
...
Рейтинг: 0 / 0
Как убрать лишние значки после перезапуска приложения?
    #39498228
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,


Там вот так примерно это делается
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    Dim nid As New NOTIFYICONDATA
    With nid
      .cbSize = IIf(sys_WinVista, Marshal.SizeOf(nid), Marshal.SizeOf(nid) - IntPtr.Size) 'NOTIFYICONDATA_V3_SIZE для XP
      .hWnd = Form1.Handle 'Handle to parent window
      .uID = vbNull 'Id of the icon
      .uFlags = NIF_INFO 'Options: show balloon
      Select Case the_message.m_type
       Case MessageType.MES_NEW_VERSION_AVAILABLE
          .dwInfoFlags = IIf(sys_WinVista, NIIF_USER Or NIIF_LARGE_ICON, NIIF_USER)
          .szInfo = the_message.m_error_text & Chr(0) 'Message
          .szInfoTitle = strL_Notify_Title_NewVersion & Chr(0) ' 
          If sys_WinVista Then .hBalloonIcon = IconNotify_NEW_VER.Handle
...
      End Select
    End With
    Shell_NotifyIcon(NIM_MODIFY, nid) 'Show balloon



sys_WinVista - все что больше Виста включая Win10
NIIF_LARGE_ICON - согласно докам .hBalloonIcon берется из GetSystemMetrics если быть точным, хотя я пихаю в лоб 32х32.
Но GetSystemMetrics (<Large>) и на 10-ке дает 32, один раз игрался, вроде не получается там что-то иное впихнуть (в смысле иконку другого размера).

В 10-ке имеем гибрид между "Desktop" и "Модерн", и скорее всего там какая-то муть за пределами классических API.
(сюда же меню кнопки старт правой кнопкой мыши - оно вроде по поведению Classic (в 8.1 там такое же, но еще чистый Classic), а стиль у него "Модерн").

Я только обратил внимание когда игрался, что когда этот Ballon на Win10 выводится, в %temp% образуется некий png кажется, сделанный из иконки, но даже не 48x48, а совершенно кривых размеров, что-то типа 43х43 или 51х51, не помню.

Если видел Win10 Preview, то там эти Tray Notifications были с иконками гигантских вообще размеров, в первом Release это вообще убрали, а потом с обновлениями тихонько "немного увеличили".

Вообще неохота счас этим заниматься, хотя и люблю копаться в этих мутях.
Не одно мое приложение страдает этим "чуть размытием", а гораздо более известные, считай все кроме м.б. встроенных новых от MS типа защитника или One Drive.
...
Рейтинг: 0 / 0
Как убрать лишние значки после перезапуска приложения?
    #39499412
Abejon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CEMb, спасибо, самый банальный и очевидный ответ оказался самым верным. :)
...
Рейтинг: 0 / 0
Как убрать лишние значки после перезапуска приложения?
    #39654436
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbДмитрий77Процесс Explorer может внезапно себя перегрузить, в этом случае иконка в трее не самовосстанавливается.
У меня этот вопрос решен таймером (1 с), который "обновляет" иконку (т.е. в указанном случае она восстановится).
Не самое красивое возможно, но вполне рабочее решение (заодно этот код может менять иконку на другую).

Можно подписаться на специальное событие:
Код: plaintext
1.
uTaskbarRestartMsg = RegisterWindowMessage(TEXT("TaskbarCreated"));

И ловить его у себя в WndProc основного окна:
Код: plaintext
1.
2.
3.
4.
if(message == uTaskbarRestartMsg)
{
// Shell_NotifyIcon(заново);
}


Счас внезапно обнаружил (через 3 года как это было написано), что у меня в .Net добавленный формально таймер кот. делает NIF_ICON+NIM_MODIFY ни фига не восстанавливает иконку после краша explorer. Странно, а в VB6 работало, вроде.
Вспомнил про этот пост.
Совет с uTaskbarRestartMsg + Shell_NotifyIcon(заново NIM_ADD)
как раз помог, ну да это и грамотней, чем "долбежный таймер", коими злоупотреблял когда-то.
Спасибо.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как убрать лишние значки после перезапуска приложения?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]