В этом разделе данной лабораторной работы мы рассмотрим выполнение операций с окнами уже запущенных приложений. Запуск внешнего приложения рассмотрен в лабораторной работе, посвященной процессам и потокам.
Чтобы управлять окном приложения сначала необходимо определить его дескриптор – уникальный 32-разрядный номер объекта.
Для окон верхнего уровня это можно выполнить функцией FindWindow.
Function FindWindow(lpClassName, lpWindowName : PChar) : hWnd;
Здесь:
lpClassName – имя класса окна;
lpWindowName – имя окна, отображаемое в строке заголовка окна;
hWnd - тип дескриптора окна (определен в модуле Windows как тип LongWord).
Можно определить любой из этих параметров, равным nil, что означает, что под критерий поиска подходит любое окно или любой класс.
Наиболее просто эту функцию использовать для определения дескриптора окна, которое создает ваше же приложение, так как в этом случае вы точно знаете и имя класса и имя окна:
Пример:
var DES: hWnd
…
DES := FindWindow('TForm2','Отчет № 1');
Задача усложняется, если надо управлять окном внешнего приложения. В этом случае имя класса неизвестно (в этом случае используют значение nil). Самый любимый пример в литературе, - управление калькулятором Windows, мы также его приведем:
Пример:
var DES: hWnd
…
DES := FindWindow(nil,'Калькулятор');
Однако такой способ крайне ненадежен, лучше указывать оба параметра. Сделать это не так уж и трудно. В состав пакета Delphi входит программа WinSight32, которая позволяет определить требуемые параметры. Для этого:
· Запустите интересующее вас приложение (остальные приложения пока лучше закрыть, чтобы вам не мешала дополнительная информация);
· запустите WinSitght32 (файл …\Program Files\Delphi\Bin\ws32.exe или Пуск | Программы | Boland Delphi 6 | WinSight32);
· Выполните Spy | Find Window ;
· в выведенном списке, ориентируясь на имя запускающего файла и заголовок окна (последний элемент строки), найдите строку интересующего вас приложения.
А более надежный способ определения дескриптора окна калькулятора будет выглядеть следующим образом:
Пример:
var DES: hWnd
…
DES := FindWindow('SciCalc','Калькулятор');
Для сворачивания окна приложения до пиктограммы используется функция Win32 API Close Window:
Function CloseWindow (hWnd : hWnd) : boolean;
Здесь:
hWnd- дескриптор сворачиваемого окна, при неуспешном завершении выполнения функции возвращаемое значение дескриптора равно нулю.
Пример:
var DES: hWnd
…
DES := FindWindow('SciCalc','Калькулятор');
CloseWindow (Des);
Здесь мы сначала определяем дескриптор окна функцией Find Window, а затем сворачиваем его функцией CloseWindow.
Для закрытия окна с его разрушением можно использовать функцию DestroyWindow, но только в том случае, если и разрушаемое окно и процедура, выполняющая его разрушение, принадлежат одному потоку (в однопоточном случае – одному приложению, более подробно потоки будут рассмотрены в последующих лабораторных работах).
Чтобы аккуратно завершить внешнее приложение, дав ему произвести необходимую очистку, мы должны послать сообщение WM_CLOSE всем видимым окнам верхнего уровня, принадлежащим приложению. Посылка сообщения WM_CLOSE эквивалентна команде Закрыть системного меню окна. Например, при закрытии таким способом окна редактора MS Word, если документ редактировался и не был сохранен, перед закрытием MS Word предложит сохранить внесенные в документ изменения.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.