2006 г.
Биллиг Владимир Арнольдович Интернет-Университет Информационных Технологий, INTUIT.ru
Назад Оглавление Вперёд Примеры работы с Win32 API функциями
Разговор об особенностях вызова Win32 API функций еще не закончен. Тем не менее, пора прервать общее изложение и обратиться к примерам. Многое из того, что было сказано, целесообразно проиллюстрировать примерами работы с конкретными функциями Win 32 API. Каждый из наших примеров будет посвящен работе с некоторой группой функций.
Работа с окнами
Как мы уже говорили, окна - это один из основных объектов операционной системы. Функции для работы с ними находятся, в основном, в библиотеке User32 . Из большого множества функций мы отобрали несколько функций, позволяющих продемонстрировать, как можно получать описатели окон, как, зная описатель, можно получать характеристики окон и как можно изменять характеристики окон. Начнем с приведения программного текста, а уж потом подробно прокомментируем его. Заметим, что для получения корректного описания операторов Declare , используемых типов данных и констант мы использовали API Viewer и описание функций, которое можно найти на уже упоминавшемся сервере Microsoft.
В проекте нашего тестового документа был создан модуль "Окна" и в разделе его объявлений помещен следующий текст:
Пример 6: html, txt
Дадим краткую характеристику используемых функций:
GetActiveWindow возвращает описатель активного окна.GetWindowRect получает в качестве входного параметра описатель окна hwnd и возвращает значения полей структуры Rect , переданной функции в качестве второго параметра lpRect . Заметьте, тип Rect должен быть предварительно определен. Обратите внимание, первый параметр передается по значению, а второй по ссылке. Передача по ссылке позволяет функции заполнить значениями поля переданной ей структуры. Значения этих полей задают координаты прямоугольника, определяющего положение окна на экране дисплея. Возвращаемый функцией результат будет равен нулю, если выполнение функции закончится неуспехом, например, при некорректном задании описателя.GetWindowText по описателю окна возвращает его заголовок. Поскольку функция должна вернуть строку, то, как мы говорили ранее, ей передаются два параметра - lpString и cch , задающие строку и число символов, доступных для заполнения. Обратите внимание, здесь используется псевдоним с окончанием A , указывающим на использование кодировки ANSI. Опять-таки, результат, возвращаемый функцией, зависит от успеха операции.FindWindow возвращает описатель окна. Функция ищет окно и возвращает в случае успеха описатель этого окна. Окно ищется либо по имени класса, заданного параметром lpClassName , либо по заголовку, заданному параметром lpWindowName . При вызове может быть задан только один из этих параметров, второй может быть указателем с неопределенным значением.. Поскольку параметр может быть либо указателем, имеющим тип Long , либо строкой, то в предыдущих версиях по этой причине для обоих параметров следовало указывать тип Any . Теперь указывается тип String , поскольку введена специальная константа vbNullString , формально имеющая тип String , но позволяющая передать указатель со значением Null .ShowWindow позволяет сделать видимым или невидимым окно, заданное описателем, может также минимизировать, максимизировать или нормализовать его размеры. Соответствующее действие определяется вторым параметром, значения которого задаются соответствующей константой. В разделе объявлений модуля мы определили возможные значения этих констант, которые будут использованы в процессе вызова этой функции.SetWindowText позволяет установить новый заголовок окна. Является функцией, парной к функции GetWindowText , но, поскольку здесь строка заголовка передается функции, то функция устроена проще, имеет два, а не три параметра и передавать ей можно константу, что и будет продемонстрировано в нашем примере.
Приведем теперь процедуру, в которой поочередно запускаются описанные здесь функции (В примерах используются документы: DocOne6, DocTwo6
Пример 6: html, txt
Приведем сразу же и результаты отладочной печати. Заметим, что все функции выполнились успешно, поэтому не появлялись сообщения в диалоговых окнах, предусмотренные на случай неуспеха.
655706
1
Размеры окна: Left = 8 Top = 73 Right = 769 Bottom = 580
58
Microsoft Visual Basic - DocOne6 [running] - [Окна (Code)]
6684884
Окно минимизировано
Окно в нормальном состоянии
191103490
Дадим комментарии к работе этой процедуры:
- Вначале, при вызове функции API
GetActiveWindow был получен описатель активного окна. Заметим, что это было окно кода выполняемой процедуры. Значение этого описателя равно 655706 . - Затем, при вызове функции
GetWindowRect , был получен прямоугольник, определяющий положение окна на экране. Функция успешно завершила работу и вернула результат, равный 1 (истина). Как и в остальных случаях, по окончании выполнения функции мы проверили результат на успешность завершения. - На следующем шаге был получен заголовок активного окна. Как видно из распечатки заголовка, активным являлось выполняемое окно кода. Результат
58 , который вернула функция GetWindowText , задает число символов результирующей строки. Обратите внимание, перед вызовом функции передаваемая ей строка была инициализирована нулевыми символами. После успешного завершения из строки был выделен результат, задающий заголовок. Его печать показывает, что активным в момент запуска функции было выполняемое окно кода. Для выделения заголовка из строки использовался нулевой символ, как признак окончания заголовка. Для решения этой задачи можно было использовать и число возвращаемых символов - значение, возвращаемое функцией. - Следующим шагом было получение описателя окна по заданному заголовку. В качестве такового был использован заголовок окна с тестовым документом. Функция
FindWindow нашла такое окно и вернула его описатель, равный 6684884 . Обратите внимание, первый параметр был задан константой vbNullString . - Окно, описатель которого был получен в последнем вызове, дважды перестраивалось, - вначале минимизировалось, затем нормализовалось, - при двух вызовах функции
ShowWindow с различными значениями констант. - На последнем этапе снова вызывалась функция
FindWindow для нахождения описателя вновь открытого документа. Затем при вызове функции SetWindowText был изменен заголовок этого окна. Заметьте, новое значение заголовка передавалось функции в виде обычной строковой константы.
Характеристики окружения
Наш следующий пример показывает, как получить, используя вызов Win32 API функций, следующие характеристики окружения:
- Версию используемой операционной системы.
- Тип процессора.
- Общий и используемый объем физической и виртуальной памяти.
Функции, используемые в этом примере, принадлежат библиотеке Kernel32 . Заметьте, что в отличие от большинства случаев в данном примере будут вызываться не только функции, но и процедуры, хранящиеся в библиотеке Kernel32 . Начнем с описания констант, типов и операторов Declare , предшествующих вызову API функций:
Пример 6: html, txt
Для сбора информации об окружении - используемом процессоре, операционной системе, имеющейся памяти и других характеристиках компьютера используем три следующие функции (процедуры) Win32 API:
- Функция
GetVersionEx имеет в качестве единственного параметра, передаваемого по ссылке, структуру типа OSVERSIONINFO . В результате выполнения функции будут заполнены поля этой структуры, содержащие всю необходимую информацию об используемой версии операционной системы. Конечно, необходимо в раздел объявлений включить и объявление типа OSVERSIONINFO . Возвращаемый функцией результат позволяет проанализировать успешность ее выполнения. - Процедура
GlobalMemoryStatus имеет единственный, передаваемый по ссылке параметр типа MEMORYSTATUS . В результате выполнения процедуры поля структуры заполняются собранной информацией об объеме физической и виртуальной памяти, общей и доступной для использования в текущий момент, размере слова и некоторых других характеристиках памяти. - Процедура
GetSystemInfo имеет единственный, передаваемый по ссылке параметр типа SYSTEM_INFO . В результате выполнения процедуры поля структуры заполняются собранной системной информацией о типе процессора, числе процессоров, используемом размере страницы и других характеристиках компьютера. Нужно ли говорить, что для корректного вызова функции требуется объявление типа SYSTEM_INFO и констант, необходимых для анализа значений поля dwProcessorType , определяющего тип центрального процессора.
Приведем теперь процедуру, в которой вызываются указанные функции API, обрабатывается полученная информация, конечные результаты выводятся в окно отладки:
Пример 6: html, txt
Программа, по-видимому, не нуждается в особых комментариях, и мы ограничимся приведением результатов отладки, которые показывают мое рабочее окружение:
Windows NT 4.0 (Build 1381)
Процессор: Intel Pentium
Число процессоров: 1
Размер страницы: 4096
Минимальный адрес приложения: 65536
Максимальный адрес приложения: 2147418111
Физическая память. Всего: 32 180K
Физическая память. Доступно: 4 772K
Виртуальная память. Всего: 2 097 024K
Виртуальная память. Доступно: 1 982 872K
Длина слова: 32
Загрузка памяти: 0
Назад Оглавление Вперёд
|
|