· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Tray Icon Handle

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Июн 7, 2004 16:38:38

Вот такой вопрос:
В трэе висит иконка некой проги. Прога несколько глюкавая - периодически зависает - переходит в неактивное состояние. В активном и неактивном состоянии иконка отображается разная. Идея такая - сделать маленькую прогу которая по иконке определяла бы состояние проги и перезапускала бы ее. Собсно вопрос - как получить хэндл иконки трэевой проги? Или может быть как то еще подобраться к этой проблеме?


Дата: Июн 7, 2004 20:20:43

по иконке определяла бы состояние проги

По-моему это уводит в сторону геморроя .

Или может быть как то еще подобраться к этой проблеме?

Может помониторить (ollydbg,apimon,filemon и т.д.) ту прогу , чтобы выяснить почему она глючит . Глядишь появиться более лучшая зацепка , чем хендл иконки .


Дата: Июн 7, 2004 21:35:23

Может помониторить (ollydbg,apimon,filemon и т.д.) ту прогу , чтобы выяснить почему она глючит . Глядишь появиться более лучшая зацепка , чем хендл иконки .

Лечить прогу не представляется возможным.ибо это повлечет за собой целую кучу проблем.прога - датаменеджер спутникового канала - зависание возможно связано с некорректной работой железки/драйверов карты... в общем геморрой...

поэтому оперируем перректально - через хэндл иконки...
как добраться до него???


Дата: Июн 7, 2004 21:49:14

как добраться до него???

Поищи вызов ф-ции SHELL32.Shell_NotifyIconA , в её параметрах можно увидеть где лежит структура NOTIFYICONDATA , там в шестом дворде будет хендл .

Геморой его читать оттуда и что потом с хендлом делать ?
Получать изображение иконки и сравнивать не изменилось ли оно ?

Хотя может кто знает проще варианты .


Дата: Июн 7, 2004 21:52:52

если прога зависает, то она уже не реагирует на посылаемые ей мессаги, поэтому посылай через 1-2 сек. сообщения-пустышки и смотри - как только они перестали отправляться, значит, висим-с!


Дата: Июн 7, 2004 21:53:03 · Поправил: bogrus

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

Я лечить не предлагаю . Просто уверен , что там могут быть и не визуальные зацепки , но гораздо простые в реализации .

датаменеджер спутникового канала

Может там ping послать достаточно чтобы проверить ? :)


Дата: Июн 7, 2004 22:09:17

Я наверное напрасно опустил подробности глюкаю
прошу прощения - вот что происходит на самом деле.
есть железка - принимает датастрим со спутника.прога является обработчиком этого стрима. о его валидности она сигнализирует иконлой яркозеленого цвета, когда возникают проблемы (прекращается поток данных) прога ставит темнозеленую иконку. когда данные опять начинают поступать прога должна это дело заметить и засветить правильную иконку - (естественно не в иконке счастье).
в общем "зависания" как такового не происходит - просто из этого состояния прога не выходит - не замечает возобновления стрима... но прекрасно реагирует на мышиную возню. возможно виноваты дрова железки или еще чтотою при перезапуске проги - скорее всего реинициализируется железо и все начинает работать...

так что иконка это просто сигнал что котенок сдох...

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

вот отсюда и вопрос


Дата: Июн 7, 2004 23:53:32

попробуй поставить бряк в айсе на Shell_NotifyIcon и когда при смене иконки отладчик вслывет, проследи откуда прищел вызов и пропадч hiew'ов код на перезапуск программы (достаточно передавать управление на свою функцию в своей DLL).

как вариант, - пропатч в таблице импорта Shell_NotifyIcon на адрес своей функции и посмотри какие аргументы програ принимает при смене на "плохую" иконку. попиксельно сравнивать саму иконку - не надо ;)
одно из двух - либо смена плохой/хорошей иконки осуществляется из разных мест (см. на адрес возврата в стеке), либо будет разный pnid.
дожидаешься нужного тебе - и перезапускаешь программу, хотя это и варварство, лучше бы разобраться в чем глюк, по крайней мере приобретешь опыт ;)


Дата: Июн 8, 2004 00:16:45

какие аргументы програ принимает при смене на "плохую" иконку
push hIcon2
pop NOTIFYICONDATA.hIcon
invoke Shell_NotifyIcon,NIM_MODIFY,addr NOTIFYICONDATA
Этого будет достаточно чтобы сменить иконку . Т.е. меняеться только хендл .

Я вот пока подготовил 23-й туториал под мишень , там через 5000 милисек. сменяеться иконка .
Короче утро вечера мудренее .

_1355319242__trayicon.zip


Дата: Июн 8, 2004 00:20:01

> Этого будет достаточно чтобы сменить иконку . Т.е. меняеться только хендл .
извиняюсь, некорректно выразился.
под разным pnid'ом, я понимал не разные указатели на pnid, а его содержимое


Дата: Июн 8, 2004 07:50:57 · Поправил: light

Эх, спасибо за помощь, дядьки!
Конечно я знаю про нотифайайкон и прочую лабуду :)
Идея была именно добиться эффекта не влезая в прогу - такое решение было бы в определенном смысле универсальным - не важно какой версии прога и т.п....
ну а так - собственно все просто - запускаем процесс который следит что пациент загружен - если не загружен - то загружаем. а в самой проге патчим то место, где меняется икона на плохую, на ExitProcess. Но - не этого хотелось :(

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


Дата: Июн 8, 2004 10:19:08 · Поправил: bogrus

Идея была именно добиться эффекта не влезая в прогу

Нам патчить там ничего не надо , достаточно прочитать пару байт через ReadProcessMemory и если они изменились с момента запуска проги то перезапускаем . Т.е. сделать типа guardian для проги , который сам её запускает через CreateProcess и по таймеру проверяет .
Есс-но тебе сначала надо узнать смещение NOTIFYICONDATA .
Может ещё какие проблемы появяться . Эта прога хоть экзешник ?

ну а все таки - вопрос о том, как получить хэндл иконы из трэя ,принадлежащей другому процессу, остается открытым :)

Как ты себе представляешь получение хендла оттуда ?
Во-первых там не иконки , а Image_List для тулбара . Максимум что получишь наверное только индекс битмапа , а как узнать чьей ? Там ведь иконки прыгают , меняються местами ... :)
Сам Explorer.exe находит требуемую процедуру обр. сообщений только по адресу в NOTIFYICONDATA.uCallbackMessage и туда "шлёт" сообщение .
А указатель на начало NOTIFYICONDATA (какой проге слать) видимо в недрах где-то ещё лежит .


Дата: Июн 8, 2004 22:21:29

light Уже передумал ? :)

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

1426391356__guardian.zip


Дата: Июн 8, 2004 22:40:27 · Поправил: light

bogrus
Нам патчить там ничего не надо , достаточно прочитать пару байт через ReadProcessMemory и если они изменились с момента запуска проги то перезапускаем . Т.е. сделать типа guardian для проги , который сам её запускает через CreateProcess и по таймеру проверяет .

А вот это действительно вариант получше :)
Возьмусь за дисассемблирование! конечно вариант получится привязанный к конкретной версии, но аккуратненько...

сразу не заметил что ты и изгадник приложил :) ЗдОрово!


Дата: Июн 8, 2004 22:55:59

конечно вариант получится привязанный к конкретной версии

А ты пошли письмо в суппорт той проги , может в новой версии этого глюка уже и не будет :)
Но меня всё-равно грызут сомнения , что должен быть вариант и проще .

Возьмусь за дисассемблирование!

Лучше отладчик (я пользуюсь Ollydbg) . И ещё , я не учитывал , что прога может грузиться по разным адресам , а NOTIFYICONDATA.hIcon вдруг у тебя где-то в dll .

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.057