Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Пример 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).

 

Примерный вид окна программы (указатель мыши наведен на само окно программы, список дочерних окон содержит список расположенных на форме компонентов):

 

Контрольные вопросы

  1. Что из себя представляет дескриптор окна?
  2. Как задать свой класс окна для оконного приложения в Delphi?
  3. Какая процедура в Delphi позволяет получить координаты указателя мыши?
  4. Какой командой можно свернуть окно, зная его дескриптор?
  5. Как проверить, является ли окно с заданным дескриптором видимым?
  6. Как определить класс окна по его дескриптору?

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...