Прототип к варианту 8 - Просмотр информации об окнах
Программа WinView предназначена для просмотра информации об окнах. В ней продемонстрированы некоторые функции API, работающие с объектами окон. Операции WinView делятся на две категории: поиск/выбор окна и просмотр информации об окне.
Для поиска и выбора окон используется меню LoadList, состоящее из пяти команд. Команда TopLevel заполняет список перечнем всех окон верхнего уровня в системе (см. рис. 5.6). Для каждого окна выводится манипулятор, имя приложения и имя класса. Команда Children заполняет список перечнем всех дочерних окон текущего выделенного окна. Команда Owned заполняет список перечнем всех собственных окон текущего выделенного окна. Поскольку собственные окна также могут быть окнами верхнего уровня, они могут присутствовать и в другом списке,
Команда Pointed позволяет навести курсор на любое окно вашего приложения и щелкнуть на нем, чтобы включить его в список. В исходной версии для Win 16 этот режим позволял работать с любым окном в системе, но Win32 не позволяет захватывать ввод мыши в других приложениях, поэтому эта возможность отпадает. Однако графическое поле picPolnt2 позволяет добиться того же эффекта даже с другими приложениями. Хотя Win32 и не позволяет захватывать ввод с мыши в других приложениях, существует одно маленькое исключение. Если мышь захватывается при нажатой кнопке, то до отпускания кнопки захват будет распространяться на всю систему. Это было необходимо для того, чтобы сохранить поведение многих приложений Windows — например, во время перетаскивания (drag-and-drop) ввод с мыши должен направляться в одну очередь ввода независимо от того, над каким приложением находится указатель мыши. Инструменты независимых фирм (например, Desaware SpyWorks) позволяют реализовать полноценный захват мыши в Win32. Некоторые элементы также используют возможность захвата мыши при нажатой кнопке. В WinView для этой цели предназначен элемент picPointZ — вы щелкаете на графическом поле, удерживаете нажатой кнопку мыши и перемещаете курсор на другое окно системы. В элементе Label! выводится информация об окне, находящемся под курсором. Если отпустить кнопку мыши, данные об окне в текущей позиции включаются в список.
Любое окно, находящееся в списке, может быть выделено. Щелкая на кнопках, вы получаете информацию о выделенном окне. Команда Clear стирает содержимое списка.
1.7. WINVIEW.BAS
Листинги программы WinView
В модуле WINVIEW.BAS, приведенном в листинге 5.7, объявляются константы и глобальные переменные, используемые программой. В листинге 5.8 содержится программный код формы WINVIEW.FRM.
Переменная PointMode% определяет, находится ли система в режиме наведения, при котором форма WinView захватывает мышь (см. следующий листинг) и использует событие MouseMove для обновления элемента Labell сведениями об окне, над которым находится курсор. %PointMode может принимать значения -1 и -2 в двух разных режимах наведения. Значение 0 означает нормальный режим работы.
Константы API, используемые в этом приложении, можно найти в файле приложения на компакт-диске и в файле API32.TXT. В этом приложении используются константы со следующими префиксами: GWL_, GCL_, WS_, CS_, GW_, ES_, BS_, SS_, LBS_, CBS_ и SBS. Значения этих констант изменились по сравнению с Win 16. В процессе переноса проекта проще всего удалить все старые константы и добавить новые в расчете на то, что компилятор Visual Basic найдет все необъявленные константы (не забудьте включить команду Option Explicit во все модули и формы).
В книге константы не приводятся для экономии места.
Листинг 5.7. WINVIEW.BAS
Во время события Form_Load списку посылается сообщение, устанавливающее внутренние по* зиции табуляции. Дополнительные сведения об этой операции приведены в главе 18. Перед вами первое из многих мест, где целая переменная или массив заменяются длинным аналогом при переносе в Win32. Также не забудьте проследить за тем, чтобы все формы и модули начинались с команды Option Explicit.
В событии MenuTopLev6l_Click() продемонстрирован первый способ перечисления окон. Сначала мы получаем манипулятор окна рабочего стола (представляющего весь экран). Все окна в сие* теме считаются потомками рабочего стола — впрочем, это вовсе не означает, что они являются его дочерними окнами. Лучше рассматривать рабочий стол как окно, обладающее специальными возможностями, в числе которых — перечисление других окон в системе. Аналогичная методика применена в событии MenuChildren_Click(), однако на этот раз перечисление начинается не с рабочего стола, а с выделенного окна.
Перенос этих функций в Win32 происходит весьма прямолинейно. Самым заметным изменением является преобразование манипуляторов окон и связанных функций из целого типа в длинный. Поскольку исходная программа была написана для Visual Basic 1.0, для очистки списков в ней применялось сообщение LB_RESETCONTENT — метод Clear в то время еще не существовал. При переходе на 32-разрядную платформу представилась хорошая возможность сократить объем кода и воспользоваться методом Clear. Ситуации, когда вместо встроенных методов Visual Basic следует использовать функции API, встречаются довольно редко — и не в данном случае (за рекомендациями по применению конкретных функций обращайтесь к секции «Использование в VB» справочного раздела).
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.