Пример 3. Взаимодействие с окнами сторонних приложений.
ТРПО. Лабораторная № 6 Взаимодействие с оконными приложениями Теоретическая часть Каждое окно в Windows имеет свой дескриптор (уникальный целочисленный идентификатор, тип данных HWND). Зная дескриптор окна можно получить к нему доступ. В Delphi в модуле Windows определены следующие функции для работы с окнами.
function FindWindow(lpClassName, lpWindowName: PChar): HWND; Функция возвращает дескриптор окна, удовлетворяющий запросу (0 - если такого окна не найдено). lpClassName – имя класса, по которому производится поиск среди всех окон системы. lpWindowName – заголовок окна. Один из параметров может быть равен nil, тогда поиск ведется по другому параметру.
function GetWindow(hWnd: HWND; uCmd: UINT): HWND; Функция возвращает дескриптор окна удовлетворяющий запросу. hWnd – дескриптор какого-либо начального окна. uCmd – принимает одно из следующих значений-констант: GW_OWNER – возвращается дескриптор окна-предка (0 - если нет предка). GW_HWNDFIRST – возвращает дескриптор первого окна (относительно hWnd). GW_HWNDNEXT – возвращает дескриптор следующего окна (окна перебираются без повторений, т.е. если вы не меняли параметр hWnd функции, повторно дескрипторы не возвращаются). GW_CHILD – возвращает дескриптор первого дочернего окна.
function GetWindowText(hWnd: HWND; lpString: PChar; nMaxCount: Integer): Integer; Функция позволяет получить текст окна. Для формы это будет заголовок, для кнопки - надпись на кнопке. Результат функции – количество символов в тексте окна или 0 в случае ошибки. hWnd – дескриптор того окна, текст которого нужно получить. lpString – переменная, в которую будет помещен результат nMaxCount – максимальная длина текста, если текст длиннее, то он обрезается.
function SetWindowText(hWnd: HWND; lpString: PChar): BOOL;
Устанавливает текст окна. hWnd – дескриптор того окна, текст которого нужно установить. lpString – строка, содержащая устанавливаемый текст.
function GetClassName(hWnd: HWND; lpClassName: PChar; nMaxCount: Integer): Integer; Функция позволяет получить класс окна. Результат функции – количество символов в названии класса или 0 в случае ошибки. hWnd – дескриптор окна. lpClassName – переменная, в которую будет помещен результат. nMaxCount – максимальная длина текста, если текст длиннее, то он обрезается.
function IsWindow(hWnd: HWND): BOOL; Возвращает True, если окно с заданным дескриптором существует и False в противном случае. hWnd – дескриптор нужного окна.
function MoveWindow(hWnd: HWND; X, Y, nWidth, nHeight: Integer; bRepaint: BOOL): BOOL; Перемещает окно в новую позицию. hWnd – дескриптор перемещаемого окна. X, Y, nWidth, nHeight – соответственно: новые координаты X, Y; новая ширина, высота. bRepaint – булево значение, показывающее будет ли окно перерисовано заново.
function IsWindowVisible(hWnd: HWND): BOOL; Возвращает True если данное окно видимо. hWnd – дескриптор окна.
function EnableWindow(hWnd: HWND; bEnable: BOOL): BOOL; Устанавливает доступность окна(окно недоступно, если оно не отвечает на события мыши, клавиатуры и т.д.). Аналог в Delphi свойство Enabled компонентов. EnableWindow возвращает True, если всё прошло успешно и False в противном случае. hWnd – дескриптор окна. bEnable – булево значение, определяющее доступность окна.
function IsWindowEnabled(hWnd: HWND): BOOL; Возвращает для заданного окна: True, если окно доступно и False в противном случае. hWnd – дескриптор окна.
function WindowFromPoint(Point: TPoint): HWND; Возвращает дескриптор окна, находящегося в данной точке экрана. Point – координата точки экрана типа TPoint.
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; Показывает или прячет окно. hWnd – дескриптор нужного окна nCmdShow – константа, определяющая, что будет сделано с окном: SW_HIDE – скрыть окно. SW_NORMAL – нормальное состояние окна. SW_MINIMIZE – свернуть окно. SW_MAXIMIZE – развернуть окно.
function CloseWindow(hWnd: HWND): BOOL; Закрывает окно. hWnd – дескриптор закрываемого окна.
Пример 1. Определение класса чужих окон. Для поиска окон функцией FindWindow лучше всего использовать класс окна, а не текст, потому как текст может меняться в ходе выполнения приложения. Для своего собственного приложения именем класса окна будет значение свойства Name формы с буквой «T» вначале (например, TForm1). Чтобы узнать классы окон чужих приложений можно воспользоваться следующей консольной программой.
uses Windows;
var CurPos: TPoint; // координаты Wnd: HWND; // дескриптор окна WinClass, WinText: PChar; // класс и текст окна
begin { выделение памяти под строки PChar } GetMem(WinClass, 255); GetMem(WinText, 255); { бесконечный цикл } while true do begin { получение позицию курсора мыши } GetCursorPos(CurPos); { получение дескриптор окна в позиции курсора } Wnd:= WindowFromPoint(CurPos); { получение класса окна } GetClassName(Wnd, WinClass, 255); { получение текста окна } GetWindowText(Wnd, WinText, 255); { преобразование кодировки для вывода русских букв } CharToOEM(WinText, WinText); { вывод результата в консоль } WriteLn(WinClass, ' - ', WinText); { задержка в 1 секунду } Sleep(1000); end; {while} end.
Программа отображает имя класса и текст окна, на которое наведен курсор мыши. Можно заметить, что под окнами в Windows понимаются не только сами окна программ, но и отдельные их элементы – кнопки, поля ввода текста, панели и прочее. Более того, существует иерархия окон, то есть окно может иметь предка и набор дочерних окон.
Пример 2. Вывод списка всех окон. Выведем список классов и текста всех открытых окон в системе. Для этого запустим следующую консольную программу.
uses Windows;
var Wnd: HWND; // дескриптор окна WinClass, WinText: PChar; // класс и текст окна
begin { выделение памяти под строки PChar } GetMem(WinClass, 255); GetMem(WinText, 255); { поиск первого окна } Wnd:= FindWindow(nil, nil); { перебор всех окон } while Wnd <> 0 do begin { получение класса окна } GetClassName(Wnd, WinClass, 255); { получение текста окна } GetWindowText(Wnd, WinText, 255); { преобразование кодировки для вывода русских букв } CharToOEM(WinText, WinText); { вывод имени класса и текста окна } Write(WinClass, " - ", WinText); { ожидание нажатия Enter } ReadLn; { поиск следующего окна } Wnd:= GetWindow(Wnd, GW_HWNDNEXT); end; {while} { освобождение памяти } FreeMem(WinClass, 255); FreeMem(WinText, 255); end.
Программа не выводит информацию о дочерних окнах. Каждое окно может содержать множество дочерних.
Пример 3. Взаимодействие с окнами сторонних приложений. Проведем манипуляции с окном программы Блокном. Запустим программу, изменим размеры и положение окна, зададим свой заголовок.
uses Windows;
var Wnd: HWND;
begin { запуск Блокнота } WinExec('notepad', SW_SHOWNORMAL); { ожидание запуска Блокнота } repeat { поиск окна с именем класса 'Notepad' } Wnd:= FindWindow('Notepad', nil); { задержка 100 милисекунд } Sleep(100); until Wnd <> 0; { перемещение окна Блокнота и изменение его размеров } MoveWindow(Wnd, 0, 0, 320, 240, True); { изменение текста заголовка окна } SetWindowText(Wnd, 'Hello, World!'); { задержка 5 секунд } Sleep(5000); { отображение окна Блокнота во весь экран } ShowWindow(Wnd, SW_MAXIMIZE); { задержка 5 секунд } Sleep(5OOO); { сворачивание окна Блокнота } ShowWindow(Wnd, SW_MINIMIZE); end.
Название класса «Notepad» окна Блокнота было получении с помощью программы из первого примера.
Практическая часть Разработать оконное приложение, выводящее информацию об окнах. Необходимо вывести позицию указателя мыши, класс и текст окна, на которое наведен указатель и список всех его дочерних окон. Для получения первого дочернего окна можно воспользоваться функцией GetWindow с параметром GW_CHILD. В списке дочерних окон необходимо выводить только те, которые являются видимыми (определяется функцией IsWindowVisible). Все описанные операции удобно проделывать в таймере (компонент TTimer).
Примерный вид окна программы (указатель мыши наведен на само окно программы, список дочерних окон содержит список расположенных на форме компонентов):
Контрольные вопросы
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|