Дрессированные окна Александр Гайша Хакер, номер #086, стр. 086-116-3 К каждому окну «прикреплена» своя процедура обработки сообщений (оконная процедура или функция), которую обычно называют WndProc (WindowProc), хотя это жестко и не фиксировано (ты можешь сделать прогу с оконной процедурой GetInZhopa). Функцию эту вызывать не надо, так как она имеет специальный модификатор CALLBACK, а значит, вызывается самой ОС. Аргументами функции являются как раз само сообщение, его параметры и хэндл целевого окна. Внутри у WindowProc должен быть оператор-переключатель (switch или case), который запускает ту или иную часть кода, в зависимости от пришедшего сообщения. Получается, что программа реагирует на события, о которых ей сообщает винда. Впрочем, нам это все знать и не надо. Нас интересует только то, что если мы сами пошлем окну Word’а сообщение WM_LBUTTONDOWN, то он будет думать, что это пользователь нажал левую кнопку мыши. То есть мы вроде как эмулируем действия пользователя. Здорово, правда? Однако, для того чтобы у тебя составилась полная картина происходящего, мне надо сказать еще пару слов об архитектуре windows. В ось встроен набор базовых функций, составляющих API (программный интерфейс) ОС. Эти функции находятся в самых главных файлах системы: kernel32.dll, user32.dll, gdi32.dll и других динамических библиотеках. Мы, кодеры, можем вызывать любую из этих API-функций в своих Win32-программах. Нам для работы понадобится совсем мало API-функций: для поиска окон, посылки сообщений и работы с потоками. Рассматривать их будем по мере надобности. [реализация] А теперь по пунктикам, расписанным ранее (с 0 по 9), мы реализуем наш замечательный алгоритм. Пункт №0. Находим окно с полем ввода пароля. Обычно поиск окна осуществляется функцией FindWindow по его заголовку (можно искать еще и по классу окна, но для этого надо знать имя класса). Синтаксис функции смотри на врезке. Часто используется и расширенная версия FindWindowEx, она описана там же. Последняя позволяет производить поиск окон еще и через их родителей или детей. title:=’Требуется пароль-допуск’; hIEPassWindow:=FindWindow(nil,PChar(title)); Далее у нас идет пункт №1. Текстовое поле можно было искать функцией FindWindowEx, выбирая из всех детей диалогового окна hIEPassWindow только то, которое имеет имя класса Edit (заметим, что в нашем окошке поле для редактирования текста всего одно, значит, любой найденный эдит будет тем, в который вводится пароль). Однако, я думаю, будет полезно указать еще один метод перебора всех детей заданного окна и вызова для каждого найденного чайлда той функции, которую мы захотим (вызываемой функции передается хэндл найденного окна-чайлда и 4-байтный параметр lParam). while(EnumChildWindows(hIEPassWindow,@lpEnumFunc,0))do; Этот оператор будет выполняться до тех пор, пока функция lpEnumFunc не вернет фолс. А она это сделает тогда, когда мы ей скажем: |