![]() |
|
Модераторы: Akina |
![]()
|
|
| cardinal |
|
||||||||||||||||
![]() Инженер ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 19 Всего: 99 |
Предыстория: на форуме JusTalionis-ом была поднята тема про прозрачность фона иконок и настолько она получилась интересная, что cardinal попросил написать небольшую статейку для ФАК-а. Чем собственно я и занялся. Но просто описывать как сменить цвет мне не захотелось, поэтому статью можно рассматривать как простенький пример по механизму управления контролами при помощи SendMessage.
И так, здесь мы рассмотрим не большой пример по управлению объектами не принадлежащих нашему приложению. Делать мы это будем естественно при помощи АПИ функций. Для большей наглядности мы выбрали простую задачу – сделать цвет подписи иконок на рабочем столе прозрачным. Теория: Поверх картинки (фона) рабочего стола лежит прозрачный элемент управления класса ListView под названием SysListView32, вот на нем то и держаться все иконочки. Следовательно первое что нам нужно сделать – это найти сей важный контрол. Как только мы найдем его мы можем делать с ним практически все что захотим, ну или по крайней мере то что позволяет нам класс ListView и его предки. Практика: И так приступим к реализации первой части нашего проекта. Для начала добавим в проект новый модуль, где будем описывать все наши функции. Дальше, как уже писалось первое что мы должны сделать это найти наш SysListView32 для этого нам понадобится две функции: FindWindow и FindWindowEx. Первая ищет базовое окно, вторая соответственно в найденном окне ищет «потомков». Вот их описания:
Каждая из них возвращает нам хэндл (тип long) найденного объекта если все прошло удачно, и в противном случае она вернет нам 0. Так поступает любая АПИ функция. Вот так мы будем искать наш лист. Для хранения хэндла нашего листа заведем переменную типа Long и в нее будем складывать результаты работы наших функций поиска:
Метод управления чужими объектами очень прост – зная хэндл объекта и его класс мы можем передавать ему служебные сообщения, которые может обрабатывать данный класс или данный экземпляр объекта. Для того чтобы передавать эти сообщения нам потребуется еще одна функция SendMessage:
Все сообщения обозначаются номерами типа Long, в других языках (например Делфи), они уже описанный в соответствующих модулях, а нам придется делать это руками. Не бойтесь ничего страшного в этом нету. Сообщения для ListView всегда начинаются с прифекса LVM_ (List View Message)
Комментарии: * Эти два сообщения нам понадобятся для того чтобы перерисовать иконочки на рабочем столе. Все эти числа легко найти в МСДН-е Кроме всего нам понадобятся еще несколько переменных для хранения возвращенных нашими сообщениями результатов работы
Приступаем к непосредственному засылу месагов:
Вот что у нас получается в итого: Код модуля:
Код кнопки на форме:
Подобным образом можно управлять любыми объектами, как принадлежащими вашему приложению так и располагающихся в самых отдаленных участках системы, будь то игра сапер, кнопка на панели вашего эксплорера или абзац в документе открытого ворда. Статья не претендует на полноту и не является руководством к действию, она просто иллюстрирует один из способов управления чужими объектами. Этот пример проверен и работоспособен только при условии выключенного Active Desktop За помощь в создании, предоставлении информации и вообще за начинание этой темы огромное спасибо JusTalionis. -------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
||||||||||||||||
|
|||||||||||||||||
![]()
|
| Правила форума "VB6" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | VB6 | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |