Могу ли я повторно получить значок систрея запущенного приложения, которое пропало? - PullRequest
4 голосов
/ 12 июля 2009

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 12 июля 2009

Восстановление значка панели задач - это то, что реализуется самим приложением (а не Проводником). Существует сообщение окна «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 является открытым исходным кодом, легко определить, какое окно искать).

4 голосов
/ 21 марта 2013

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

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

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

0 голосов
/ 03 марта 2012

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

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

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

...