Найти иконку в трее

Hello comp,
Приходится писать проект по автоматизации закачки из Инета.
Подключение к Инету должно происходить через оптимизатор модема
(скорость при этом, действительно, увеличивается на 20-50%). Сам
оптимизатор сидит в трее, и соединение инициализируется щелчком по его
иконке. Самое интересное, что по другому заставить заработать этот
оптимизатор нет.
Вот я и думал организовать процесс вызова так:
Поставить указатель в трей с помощью SetCursorPos в конец трея
Задавая приращения по горизонтали, обойти указателем иконки в
трее. При этом будут появляться ярлычки подсказок к иконкам. Вот их-то
и нужно проверять. Наблюдая за изменениями в "оконной среде" системы через
WinSight, я увидел, что эти ярлычки "привязываются" к popup-окнам с
именем класса tooltips_class32. Как я понимаю, это значит, что если с
помощью FindWindow и GetWindow обойти все окна с таким именем класса, то
GetWindowText может определить текст ярлыка, и таким образом моя прога
определит, над нужной ли иконкой находится мышь. Ну а спровоцировать
мышь на щелчок - уже дело техники.
Да вот, что-то не получается у меня отыскать в списке окон окно с
ярлычком. Я думаю, может моя прога не успевает по времени "ухватиться"
за этот ярлык. Или я концептуально ошибаюсь?
А у меня панель задач вдвое выше и автоскрывается. Мало того, что её
показать надо, прыгнув мышью в самый низ экрана и подождав, так ещё и иконки
в трее в три ряда выстраиваются. Каким образом ты собрался все их обойти по
горизонтали? И это ещё при том, что XPя по умолчанию скрывает некоторые
"неактивные" достаточно долгое время иконки за эдакой стрелочкой, и чтобы их
увидеть, на неё тоже нажать надо. И при этом не забыть, что панель задач
может быть не только внизу, но и справа, слева или вверху, где юзеру
удобнее. А если она автоскрывается, то при "автопоказе" оно не обязательно
будет на переднем плане, а вполне может оказаться под какими-то другими
окнами, даже если выставлена опция "Отображать панель задач поверх остальных
окон" - как меня нервирует, кстати.
Ну и чтобы добить. Ждать над каждой иконкой, нужно неопределённое время,
так как частенько обработчик рабочего стола неизвестно чем занимается вместо
того, чтобы побыстрому обработать событие, ему направленное. У меня иногда
бывает, что рабочий стол и панель задач не откликаются на воздействия извне,
хотя остальная винда работает как ни в чём не бывало, и все мышиные и
клавиатурные пинки не возымевают никакого действия. По прошествии
полутора-двух минут, они друг приходят в себя и побыстрому обрабатывают всё
то, что им быто понапнуто за это время. Весело бывает понаблюдать...
Напрягает не меньше. Если кто знает лекарство или хотя бы причину такого
поведения, буду рад любой информации.
Так что ИМХО избранный тобою подход в корне неверен. Я в принципе
недолюбливаю всё то, что делается потём эмуляции действий пользователя, так
как программно всей изощрённости человеческого разума не проэмулируешь.
Особенно его экстраваннтности и индивидуальности. Посему начисто отвергаю
решения, основанные на mouse_event() и keybd_event() Да и в MSDN чётко
говорится, что они заменены (superseded). Ищи другие пути, не то запаришся
поддерживать свою программу - пользователи задолбают.
Вот начало. Окно панели задач относится к классу Shell_TrayWnd. Одно из
его дочерних окон имеет класс TrayNotifyWnd, а у него в свою очередь одно из
дочерних - класс SysPager, которое в свою очередь одним из дочерних окно
класса ToolbarWindow32 и с заголовком (в русской редакции XP!) "Область
уведомлений", в котором уже и прорисовываются иконки. Кнопка, которая
открывает скрытые "неактивные" иконки, имеет класс Button и является
дочерним окном непосредственно от панели задач. Хватит информации для
начала? Всю её я получил простым разглядыванием Spy++ из комплекта MS
DevStudio. Но её понятное дело можно получить и программно - EnumWindows(),
EnumChildWindows(), GetWindow(), GetWindowInfo(), GetClassName() итп Скорее
всего некоторые неопределённости останутся, но ИМХО значительно меньше и
более легко обходимые, чем я привёл вначале по твоему методу.
P.S. Чуть не забыл: mouse_event() и keybd_event() заменены на
SendInput()
--
С уважением, boroda
Номер выпуска : 5188
Возраст листа : 873 (дней)
Количество подписчиков : 546
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/513477
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru