Можно ли восстановить пропавший значок работающего приложения на панели задач?

Поскольку у меня наконец-то есть ответ на этот вопрос: Можете ли вы отправить сигнал проводнику Windows, чтобы он обновил значки на панели задач, который спрашивает об избавлении от мертвых значков на панели задач, я хотел бы попросить об обратном.

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

Это происходит с моим монитором Apache с тех пор, как я установил Avira AV.
Хорошо, конечно, это может быть только побочным эффектом, но довольно раздражает то, что работающее приложение закрывается, а затем перезапускается только потому, что оно не отображает системный трей. значок правильно.

Заранее спасибо,
Гас


person Gustavo Carreno    schedule 11.07.2009    source источник


Ответы (3)


Я написал проект, который отправляет сообщение TaskbarCreated всем окнам верхнего уровня в системе. Если они зарегистрировали значок в трее, это должно привести к их восстановлению после сбоя проводника.

Я выпустил исходный код под лицензией MIT и предоставил ссылку на скомпилированное консольное приложение (с Lazarus) в файле readme.

Есть, конечно, несколько усовершенствований, которые можно было бы внести, например, не отправлять сообщение, если известно, что значок уже находится в трее, но на данный момент это приложение вызывает повторное появление значков, которые, как я знаю, отсутствуют при сбое Проводника.

person ringmaster    schedule 21.03.2013
comment
У меня будет тест на это. Но сейчас вы смотрите на новый выигрышный ответ. Спасибо!! - person Gustavo Carreno; 23.03.2013

Восстановление значка на панели задач осуществляется самим приложением (а не Проводником). Существует оконное сообщение под названием «TaskbarCreated» (его значение можно получить с помощью RegisterWindowMessage("TaskbarCreated")), на которое приложение должно реагировать, чтобы при необходимости восстановить значок панели задач.

Например, приложение может сделать это:

const int uTaskbarCreatedMsg = RegisterWindowMessage("TaskbarCreated");

Затем в его функции WndProc:

LRESULT CALLBACK WndProc(HWND w, UINT msg, WPARAM wparam, LPARAM lparam)
{
    // ... handle other messages
    if (msg == uTaskbarCreatedMsg) {
        NOTIFYICONDATA nid;
        // fill in details to create icon
        Shell_NotifyIcon(NIM_ADD, &nid);
        return 0;
    }
    // ... default message handling
}

Таким образом, чтобы заставить приложение восстановить свой значок на панели задач, вам нужно будет отправить то же сообщение TaskbarCreated в соответствующее окно в приложении. Один из способов получить HWND для окна — использовать FindMessage (а поскольку Apache Monitor имеет открытый исходный код, легко определить, какое окно искать).

person Greg Hewgill    schedule 11.07.2009
comment
Ваше решение с точки зрения приложения со значком. То, что я ищу, - это внешний способ сообщить этому приложению об обновлении значка или сигнализировать SysTray об обновлении списка значков. - person Gustavo Carreno; 12.07.2009
comment
Отправка этому приложению сообщения TaskbarCreated может помочь. В противном случае, если приложение Apache Monitor не поддерживает это сообщение, то, поскольку оно имеет открытый исходный код, вы можете добавить возможность, используя приведенный выше код. - person Greg Hewgill; 12.07.2009
comment
Я просмотрел исходный код приложения Apache Monitor (здесь: http://svn.apache.org/viewvc/httpd/httpd/trunk/support/win32/ApacheMonitor.c?view=log#rev90160 ), и похоже, что он поддерживает сообщение TaskbarCreated с момента его первой версии в 2001 году. Итак, если вы столкнетесь с ситуацией, когда его значок исчезнет, ​​то отправка этого сообщения в Apache Monitor должна указать ему воссоздать свой значок в проводнике. - person Greg Hewgill; 12.07.2009
comment
Спасибо Грегу за тщательное расследование. Я поиграю с отправкой этих сообщений и посмотрю, сработает ли это. Не могли бы вы перефразировать свой ответ, чтобы показать это новое решение? Таким образом, я могу отметить его выбранным ответом. Спасибо!! - person Gustavo Carreno; 13.07.2009

Это сработало для меня (Windows 7 - 64 бит)

  1. Запустить диспетчер задач
  2. Убить процесс apachemonitor
  3. Запустите apachemonitor из меню «Пуск».

Теперь вы должны увидеть значок в системном трее.

person avi    schedule 03.03.2012
comment
Я проголосовал против, потому что цель моего вопроса состояла в том, чтобы фактически избежать того, что вы только что предложили. - person Gustavo Carreno; 06.03.2012