Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Подмена заголовка активного окна


Автор: Ku4er 21.1.2006, 13:25
Есть такая прога Network Assistant 4.1. Кто не знает - это чат для локалки. Слишком функциональный - показывает заголовок активного окна каждого подключенного юзера. Я думаю перехватывает с помощью WinAPI. Как не знаю, но хочу разобраться и пресечь сиё позорное занятие. Помогите плиз.

Автор: Guedda 21.1.2006, 16:25
Получаем текст заголовка окна.
Код

function NT_InternalGetWindowText(Wnd: HWND): string;
 type
   TInternalGetWindowText = function(Wnd: HWND; lpString: PWideChar;
     nMaxCount: Integer): Integer;
    stdcall;
 var
   hUserDll: THandle;
   InternalGetWindowText: TInternalGetWindowText;
   lpString: array[0..MAX_PATH] of WideChar; //Буфер для названия окна
  oemStr: PChar;
 begin
   Result   := '';
   hUserDll := GetModuleHandle('user32.dll');
   if (hUserDll > 0) then
   begin @InternalGetWindowText := GetProcAddress(hUserDll, 'InternalGetWindowText');
     if Assigned(InternalGetWindowText) then
     begin
       InternalGetWindowText(Wnd, lpString, SizeOf(lpString));
       Result := string(lpString);
     end;
   end;
 end;

 procedure TForm1.Button1Click(Sender: TObject);
 begin
   ShowMessage(NT_InternalGetWindowText(Form1.Handle));
 end;


Процедура переименования заголовка окна:
Код

SetWindowText(FindWindow(nil, 'Безымянный - Блокнот'),
    'Привет!!! Это подмена!!!');

Автор: Ku4er 22.1.2006, 12:53
Спасибо большое за помощь smile . Постараюсь разобраться.

Автор: Ku4er 22.1.2006, 18:26
Хм,вроде разобрался, но....
мне необходимо не заменять заголовок окна, а перехватывать отслеживание (?) заголовка окна другой программой (при этом желательно не менять сам заголовок), если это возможно.
Вопрос в догонку: каким образом мне выяснить какое окно активно в момент времени?

Автор: Guedda 22.1.2006, 19:36
Цитата(Ku4er @ 22.1.2006, 18:26)
Вопрос в догонку: каким образом мне выяснить какое окно активно в момент времени?

См мой пост выше... Первая функция:
Цитата

Получаем текст заголовка окна.

Цитата(Ku4er @ 22.1.2006, 18:26)

Хм,вроде разобрался, но....
мне необходимо не заменять заголовок окна, а перехватывать отслеживание (?) заголовка окна другой программой (при этом желательно не менять сам заголовок), если это возможно.

Я думаю, что необходимо перехватывать все сообщения программы, которая отслеживает эти самые заголовки. И если программа посылает сообщение отслеживания, тогда передать другое сообщение.

Автор: Ku4er 23.1.2006, 14:33
C определением хендла активного окна разобрался. А вот про перехват сообщений хотелось бы узнать подробней.

Автор: SoWa 23.1.2006, 19:48
Архангельский в помощь! книга "для освоивших Дельфи"

Автор: Snowy 24.1.2006, 10:33
Уточню вопрос.
Ты хочешь перехватывать создание новых окон или появление новых кнопочек на панели задач.
Что именно тебя не устраивает?

Автор: Romikgy 24.1.2006, 11:26
Те надо перехватить от нужного тебе приложения всего две месаги, которые это приложение будет посылать активному окну,
1. WM_GETTEXT
2. WM_GETTEXTLENGTH
Первое берет текст, второе определяет его длинну.

Автор: Guedda 24.1.2006, 15:44
В общем посмотрел эту программу.
Чего париться, если можно убрать в самой программе высвечивание твоих активных окон?

Автор: Ku4er 24.1.2006, 15:44
Цитата(Snowy @ 24.1.2006, 10:33 Найти цитируемый пост)

Ты хочешь перехватывать создание новых окон или появление новых кнопочек на панели задач.
Что именно тебя не устраивает?

Я хочу чтоб был мир во всём мире smile
Сорри за флуд.
Мне необходимо перехватывать ни создание дочерних окон, ни появление всяких кнопочек, а перехватить обращение программы к заголовку активного окна, которое не я вляется дочерним (это может быть браузер, игра и т.д.). Т.е. если прога захочет показать какому-либо пользователю в сети какое окно у меня открыто в текущий момент, вместо заголовка она получила бы что-то типа "Не подглядывай ))".
В принципе я этого уже добился благодаря товарищу Guedda: программка на Delphi просто заменяет заголовок активного окна на тот, который задам я, но поскольку это очень сильно отдает кривизной, хотелось бы найти другое решение задачки.

Цитата(Guedda @ 24.1.2006, 15:44 Найти цитируемый пост)

В общем посмотрел эту программу.
Чего париться, если можно убрать в самой программе высвечивание твоих активных окон?

Можно, но это, извините за ребячество, будет не кодерски smile

Автор: Tappxxor 25.11.2007, 13:30
Цитата(Guedda @ 24.1.2006,  15:44)
В общем посмотрел эту программу.
Чего париться, если можно убрать в самой программе высвечивание твоих активных окон?

Но допустим есть аналогичная программа, в которой нельзя это вырубить в настройках..
Как было сказано выше, надо перехватывать WM_GETTEXT и WM_GETTEXTLENGTH - и наверное подменять там строку.. На одном из форумов предложили использовать SetWindowsHookEx.. Буду признателен, если кто-нибудь подскажет как примерно это реализовать для данного случая и тип хука, который надо ставить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)