{lang: ‘ru’}

sendmessage delphi, winapi sendmessage, findwindow delphi, setwindowtextНаверное каждому начинающему программисту интересно сделать что-нибудь эдакое, что может взаимодействовать с чужими программами. Лично мне это было и остается интересным.

Сегодня мы рассмотрим как подменить заголовок окна  чужого приложения.

И как же мы будем изменять заголовок чужого окна? Все очень просто, мы будем использовать функции WinAPI. Используя эти функции, мы получаем наиболее близкий к системе доступ из наших приложений. Более низкий уровень доступа нужен только для драйверов. Код программы можно писать на C/C++ или на Delphi. Я выбрал последнее, имхо, потому что код выглядит чуточку проще.

Для начала создадим форму с 2 текстовыми полями и 1 кнопкой. Окно будет иметь примерно такой вид:

sendmessage delphi, winapi sendmessage, findwindow delphi, setwindowtext

Далее мы создаем обработчик на нажатие нашей кнопки.

Нам понадобятся строковые переменные для того, чтобы хранить значения старого и нового заголовков окна.

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;

Скачать исходники можно .


Получайте новые статьи блога прямо себе на почту