Программирование на C++ глазами хакера


Работа с чужыми окнами - часть 3


  • просто число, которое может быть передано в функцию обратного вызова.
  • Как вы можете заметить, работа функции EnumChildWnd похожа на EnumWindowsWnd, только если вторая ищет окна во всей системе, то первая — внутри указанного окна. Образец такого окна можно увидеть на рис. 3.2.

    В этой функции так же изменяется заголовок найденного окна, а чтобы поиск продолжился дальше, формируется выходной параметр (присваивается ему значение TRUE).

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

    if (h==0) return TRUE;

    Рис. З.2. Результат работы программы lSeeYou2

    Вот теперь приложение можно считать завершенным и абсолютно рабочим.

    Помните, что лишних проверок не бывает. Если хотите, чтобы ваш код был надежным, то нужно проверять все, что может вызвать проблемы. В данной книге я иногда буду пренебрегать этим правилом, чтобы не усложнять и не запутывать программу, но постараюсь указывать на те участки кода, которые нуждаются в пристальном внимании.

    Примечание
    Исходный код этого примера вы можете найти на компакт-диске в каталоге \Demo\Chapter3\ISeeYou2.

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




    Начало  Назад  Вперед



    Книжный магазин