384______________________________________________Главаб

6.2 Управление внешними приложениями
6.2.1 Определение дескриптора окна приложения

Мы рассмотрели запуск внешних приложений. Теперь рассмотрим коротко во-
просы управления ими. API Windows предоставляет немало функций, позволяю-
щих управлять окнами приложений. Все они требуют указания дескриптора соот-
ветствующего окна. Поэтому прежде всего рассмотрим способы получения этих де
скрипторов.

Получить дескриптор окна можно функцией FindWindow, которая имеет вид:

HWND FindWindow(const char *lpClassName, const char *lpWindowName);

Параметр IpCIassName указывает на строку с нулевым конечным символом,
содержащую имя класса. Параметр IpWindowName указывает на строку с нуле
вым конечным символом, содержащую имя окна (это свойство Caption формы,
отображаемое в полосе заголовка окна). Если этот параметр равен NULL, то счита
ется, что под критерий поиска подходит любое окно указанного класса.

Если поиск прошел успешно, то функция возвращает дескриптор окна, имею
щего указанное имя класса и имя окна. В противном случае возвращается NULL.

Эту функцию легко использовать, если вы знаете имя класса искомого окна
Например, если ваше приложение вызвало другое приложение, созданное вами са
мими, то вы знаете имя класса формы этого другого приложения. Тогда вы може
те, например, с помощью кода

HWND Н = FindWindow("TFormI","Приложение 2");

определить дескриптор окна приложения, класс формы которого TFormI, а значе
ние свойства Caption формы — Приложение 2.

Если же приложение, которым вы хотите управлять, создано не вами, то текст
полосы заголовка вы легко можете увидеть, выполнив его, а вот имя класса вам не
известно. Пусть, например, вы запустили из своего приложения программу Win
dows «Калькулятор», чтобы пользователь смог что-то с его помощью посчитать
Как управлять в дальнейшем этим калькулятором, если требуется, например, его
свернуть, закрыть и т.д.?

Одна из возможностей узнать имя класса какого-то приложения — воспользо
ваться поставляемой вместе с C+4-Builder программой WinSight 32 (файл ...\Ргс
gram Files\Borland\CBuilder4\Bin\ws32.exe). Запустите интересующее вас приложс
ние, затем запустите WinSight 32, выполните команду Spy | Find Window и вы уви
дите список всех окон, зарегистрированных в данный момент в Windows. Лучше
чтобы в этот момент у вас было бы открыто не очень много окон, чтобы проще былг
найти среди них нужное.

В списке, который вы увидите, для каждого окна будут указаны среди прочей
информации имя класса в фигурных скобках «{ }» и заголовок окна — последни:'.
элемент данных в строке каждого окна. Например, запустив «Калькулятор», BL:

можете с помощью WinSight 32 найти, что имя класса окна этого приложения -
«SciCalc». Следовательно, определить в своем приложении дескриптор открытого
приложения «Калькулятор» вы можете оператором:

HWND Н = FindWindow("SciCalc","Калькулятор");

Другой способ найти дескриптор окна — воспользоваться функцией GetNext-
Window API Windows. Определение этой функции:

HWND GetNextWindow(hWnd hWnd, unsigned int wCmd) ;

Она определяет дескриптор следующего или предыдущего окна в Z-последова
тельности. Параметр hWnd — дескриптор окна, от которого начинается отсчет