|
|
| Посл.отвђт | Сообщен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 . |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.057 |