Наверное каждому начинающему программисту интересно сделать что-нибудь эдакое, что может взаимодействовать с чужими программами. Лично мне это было и остается интересным.
Сегодня мы рассмотрим как подменить заголовок окна чужого приложения.
И как же мы будем изменять заголовок чужого окна? Все очень просто, мы будем использовать функции WinAPI. Используя эти функции, мы получаем наиболее близкий к системе доступ из наших приложений. Более низкий уровень доступа нужен только для драйверов. Код программы можно писать на C/C++ или на Delphi. Я выбрал последнее, имхо, потому что код выглядит чуточку проще.
Для начала создадим форму с 2 текстовыми полями и 1 кнопкой. Окно будет иметь примерно такой вид:
Далее мы создаем обработчик на нажатие нашей кнопки.
Нам понадобятся строковые переменные для того, чтобы хранить значения старого и нового заголовков окна.
hNewCaption: String; hOldCaption: String;
Так же нужно объявить переменную типа HWND, в которой будет храниться идентификатор чужого окна.
ParentWnd: HWND;
Получаем из текстовых полей их значения и заполняем старый заголовок
hOldCaption := edt1.Text;
Получаем из текстовых полей их значения и заполняем новый заголовок
hNewCaption := edt2.Text;
Теперь находим нужное нам окно. Для этого воспользуемся функцией FindWindow delphi. Функция первым параметром принимает название класса окна, вторым — текущий заголовок окна. Возвращает идентификатор окна, если оно найдено или 0, если не найдено.
ParentWnd := FindWindow(nil, PAnsiChar(hOldCaption));
Если идентификатор не равен нулю, то мы используем функцию WinAPI SendMessage или SetWindowText. Я использовал функцию SetWindowText. Эта функция первым параметром принимает идентификатор окна, а вторым текст нового заголовка.
if(ParentWnd <> 0) then SetWindowText(ParentWnd, PAnsiChar(hNewCaption)) else ShowMessage('Заголовок не найден!');
В итоге обработчик будет выглядеть вот так:
procedure THackTool.btn1Click(Sender: TObject); var ParentWnd: HWND; hNewCaption: String; hOldCaption: String; begin hOldCaption := edt1.Text; hNewCaption := edt2.Text; ParentWnd := FindWindow(nil, PAnsiChar(hOldCaption)); if(ParentWnd <> 0) then SetWindowText(ParentWnd, PAnsiChar(hNewCaption)) else ShowMessage('Заголовок не найден!'); end;
Так же можно создать 2 обработчика на текстовые поля, чтобы при нажатии текст из этих полей удалялся сам.
procedure THackTool.edt1Click(Sender: TObject); begin edt1.Text := ''; end; procedure THackTool.edt2Click(Sender: TObject); begin edt2.Text := ''; end;
Скачать исходники можно .
Получайте новые статьи блога прямо себе на почту
Классный,суперский сайт,спасибо вам за информацию…)).