Взаимодействие приложения с внешними программами_______________385

Параметр  wCmd  определяет  направление  поиска.   Если  wCmd  =
GW_HWNDNEXT, то ищется следующее окно, находящееся ниже. Если wCmd =
GW_HWNDPREV, то ищется предыдущее окно, находящееся выше.

Следующее окно в Z-последовательности — это то, которое вызывалось из ука-
занного или к которому пользователь обращался после создания указанного окна.
Если указано дочернее окно, то поиск ведется среди дочерних окон.

Если искомое окно найдено, то возвращается его дескриптор. Если следующе-
го или предыдущего окна нет (в зависимости от значения wCmd), то возвращает-
ся 0.

Сейчас мы попробуем использовать функцию GetNextWindow для поиска
окна с известным текстом. Но при этом нам потребуется еще одна функция API
Windows — GetWindowText. Эта функция копирует текст, связанный с указан-
ным окном, в указанный буфер. Ее объявление имеет вид:

int GetWindowText(HWND hWnd, char *lpString, int nMaxCount);

Параметр hWnd — дескриптор окна. Параметр IpString указывает на буфер, в
который копируется текст. Параметр nMaxCount определяет максимальное число
копируемых символов. Если число символов в тексте превышает эту величину,
текст усекается.

Если функция выполнилась успешно, она возвращает число скопированных
символов, исключая завершающий нулевой символ. Если окно не имеет полосы за-
головка или текст заголовка отсутствует, или при неверном дескрипторе возвра-
щается нуль.

Теперь мы можем решить задачу, поставленную нами в качестве примера:

определить дескриптор окна выполняемого приложения «Калькулятор». Это мож-
но сделать с помощью следующего кода:

HWND H ^Handle;

char Pch[128] ;

do
{

H = GetNextWindow(H,GW_HWNDNEXT);

GetWindowText(H,Pch,128) ;

if(CompareText(Pch, "Калькулятор") == О)
break;

} while (H != NULL) ;

if (H != NULL)

Первый выполняемый оператор присваивает переменной Н значение свойства
Handle формы вашего приложения. Далее в цикле просматриваются окна, лежа-
щие ниже в Z-последовательности, и среди них ищется окно с текстом «Калькуля-
тор». Для этого используется функция CompareText, сравнивающая без учета ре-
гистра строку, на которую указывает Pch, со строкой «Калькулятор». Если строки
совпадают, функция CompareText возвращает нуль. Пользуясь тем, что C++ по-
зволяет оперировать с целыми значениями как с булевыми, строку оператора if
можно было бы записать и в таком виде:

if( ! CompareText(Pch, "Калькулятор"))

Окно калькулятора будет найдено, если оно получало фокус после запуска ва-
шего приложения. Таким образом, если пользователь запустил «Калькулятор» из
вашего приложения или даже если «Калькулятор» был запущен ранее или незави-
симо от вашего приложения, дескриптор его окна будет найден.

Если цикл завершается со значением Н = NULL, значит приложение «Кальку-
лятор» в данный момент не открыто. Если его все-таки надо открыть, то можно
для этого воспользоваться функциями, описанными в предыдущих разделах.

13 Зак.764