Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение инфы из чужой проги 
:(
    Опции темы
Ergoz
Дата 3.6.2009, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 3.6.2009
Где: Россия

Репутация: нет
Всего: нет



Я в делфи новичок, поэтому нужнаюсь в помощи. Обычно получается находить инфу в инете, но тут чего то не получилось ((( и так опишу ситуацию.

И так, пишу прогу, как дополнение к уже существующей программе (не моей) которая называется RF Rudokop, этот бот написан на С++. Мне нужно прочитать окно в который выводится чат. 

Пытался типа такой комбинации:

Код

procedure TForm1.Button1Click(Sender: TObject);  
 var  
i:integer;  
begin  
RichEdit1.Clear;  
i:=FindWindow('RF Rudokop 1.3.7k и так далее название окна бота',nil);  
 if i=0 then begin  
 RichEdit1.Text:='Rudokop not found';  
Exit;  
end;  
i:=FindWindowEx(i,0,'RichEdit20A',nil);  
 repeat  
   if GetClass(i)='RichEdit20A' then  
    RichEdit1.Lines.Add(GetCaption(i));  
  i:=GetWindow(i,GW_HWNDNEXT);  
 until i=0;  
end;  


но у меня нифига не прокатывает. просто тупо не читает, у меня в мой RichEdit1 уходит пустота... а я хочу сделать логирование чата. Кто нить походее с другими прогами делал? с тем же самым квипом к примеру?

Вот как выглядит бот:
user posted image

И так по порядку, то что выделено цветами это уровни окон, как я понимаю. Далее начну перечислять с самой попы до самого верха

ЗЕЛЁНЫЙ - RichEdit20A (Handle - 000A0C3A) - это и есть чат который мне так нужен
КРАСНЫЙ - #32770 (Dialog) (Handle - 00060C94)
СИНИЙ - SysTabControl32 (Handle - 0075072A)
Общая форма, на которой кнопки и всё прочее - #32770 (Dialog) (Handle - 00BF06D4)

Чтобы выдрать чат что нужно сделать? хоть убейте не пойму!!! Очень прошу помочь


PM MAIL ICQ   Вверх
Ergoz
Дата 4.6.2009, 03:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 3.6.2009
Где: Россия

Репутация: нет
Всего: нет



извините что апаю тему, но всё же это очень нужно знать
PM MAIL ICQ   Вверх
Ergoz
Дата 4.6.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 3.6.2009
Где: Россия

Репутация: нет
Всего: нет



я весь инет уже перерыл, и ничего не нашёл... не ужто нельзя такое реализовать???
PM MAIL ICQ   Вверх
Rrader
  Дата 4.6.2009, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Реализацию GetCaption в студию.


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Ergoz
Дата 4.6.2009, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 3.6.2009
Где: Россия

Репутация: нет
Всего: нет



Ну это то что я нашёл...

Код

function GetCaption(hWnd:HWND):string;  
var  
  len:integer;  
  text:PChar;  
begin  
 Result:='';  
 if hWnd=0 then Exit;  
  len:=SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0);  
 if len<>0 then begin  
   GetMem(text, len+1);  
   SendMessage(hWnd, WM_GETTEXT, len+1, integer(text));  
   Result:=text;  
  FreeMem(text);  
 end;  
 end; 

function GetClass(hWnd:HWND):string;
var
  arr:array[0..255] of char;
begin
  GetClassName(hWnd, arr, SizeOf(arr));
  Result:=string(arr);
end; 


procedure TfmMain.Button2Click(Sender: TObject);
 var
i:integer;
begin
RichEdit1.Clear;
i:=FindWindow(nil,PAnsiChar(fmMain.ListBox1.Items.Strings[fmMain.ListBox1.ItemIndex]));
 if i=0 then begin
 RichEdit1.Text:='Window not found';
Exit;
end;
i:=FindWindowEx(i,0,'RichEdit20A',nil);
 repeat
   if GetClass(i)='RichEdit20A' then
    RichEdit1.Lines.Add(GetCaption(i));
  i:=GetWindow(i,GW_HWNDNEXT);
 until i=0;
end;

PM MAIL ICQ   Вверх
Keeper89
Дата 4.6.2009, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Вот пример кода, отлично находит RichEdit:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  H, PageHandle, TabHandle, REHandle: THandle;
  lpBuffer: PChar;
begin
  H := FindWindow(nil, PChar('Целевая форма'));
  if H <> 0 then
  begin
    PageHandle := FindWindowEx(H, 0, 'TPageControl', nil);
    if PageHandle <> 0 then
    begin
      TabHandle := FindWindowEx(PageHandle, 0, 'TTabSheet', nil);
      if TabHandle <> 0 then
      begin
        REHandle := FindWindowEx(TabHandle, 0, 'TRichEdit', nil);
        if REHandle <> 0 then
        begin
          lpBuffer := GetMemory(1024);
          try
            SendMessage(REHandle, WM_GETTEXT, 1024, Integer(lpBuffer));
            RichEdit1.Text := lpBuffer;
          finally
            FreeMemory(lpBuffer);
          end;
        end;
      end;
    end;
  end;
end;

Нужно только подкорректировать для себя и изменить имена классов.

Прикрепляю 2 архива для примера: 1-целевая форма, 2-та, что забирает текст.

Это сообщение отредактировал(а) Keeper89 - 4.6.2009, 17:11

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  ______.rar 385,00 Kb


--------------------
PM MAIL WWW   Вверх
Ergoz
Дата 4.6.2009, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 3.6.2009
Где: Россия

Репутация: нет
Всего: нет



спасибо, попробую!!!!
PM MAIL ICQ   Вверх
Snork
Дата 4.6.2009, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 1.6.2009

Репутация: нет
Всего: нет



У меня такая же проблема. У меня на PC стоит ICQ 6.5. И мне нужно записывать весь чат в txt файл. Как можно перехватить инфу с окна чата ICQ?
PM   Вверх
Keeper89
Дата 4.6.2009, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Snork, ну и ответ тот же. Определяйте иерархию объектов (в иерархии каких оконных элементов расположен целевой компонент и их классы), например, с помощью Spy++, и используйте приведенный метод. 


--------------------
PM MAIL WWW   Вверх
Ergoz
Дата 4.6.2009, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 3.6.2009
Где: Россия

Репутация: нет
Всего: нет



Я поправил твой код под свою структуру, но всё равно в мой ричэдит выводится пустота.

Вот код который я сделал, после него скрин структуры
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  H, PageHandle, TabHandle, REHandle,RRREHandle,RREHandle: THandle;
  lpBuffer: PChar;
begin
  H := FindWindow(nil, PChar('RF Rudokop и тд.'));
  if H <> 0 then
  begin
    PageHandle := FindWindowEx(H, 0, 'SysTabControl32', nil);
    if PageHandle <> 0 then
   begin
     TabHandle := FindWindowEx(PageHandle, 0, '#32770 (Dialog)', nil);
     if TabHandle <> 0 then
        begin
     REHandle := FindWindowEx(RREHandle, 0, 'RichEdit20A', nil);
    if REHandle <> 0 then
        begin
          lpBuffer := GetMemory(1024);
          try
            SendMessage(REHandle, WM_GETTEXT, 1024, Integer(lpBuffer));
            RichEdit1.Text := lpBuffer;
          finally
            FreeMemory(lpBuffer);
          end;
        end;
      end;
    end;
  end;
end;


вот скрин структуры
user posted image

Я так полагаю что проблема с тем что там в части
  TabHandle := FindWindowEx(PageHandle, 0, '#32770 (Dialog)', nil);
проблема, потому что можно увидеть что таких диалогов докучи... что делать хз... ну не верю что нереально считать инфу оттуда!

Кстати ещё такой момент, в твоей версии если добавить в 1 программу ещё одну вкладку, то 2 программа читает только из активной вкладки. 

Вот структура первой программы после того как я подправил её для теста:
user posted image
на скрине подписано что класс одинаковый, но есть capture которая разная, вопрос, как в твоём коде её указать, допустим если будет открыта вторая вкладка, а читало бы из первой, найдя её по названию TabSheet1?

И если можно capture можно как то указывать, то тогда как можно в главной программе отловить, ведь там у диалогов пуст пункт каптюры.
PM MAIL ICQ   Вверх
Keeper89
Дата 4.6.2009, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



По поводу моего проекта сделать то, что ты говоришь просто, заменив
Код

TabHandle := FindWindowEx(PageHandle, 0, 'TTabSheet', nil);

на
Код

TabHandle := FindWindowEx(PageHandle, 0, 'TTabSheet', 'Caption нужной вкладки');


Насчет твоего примера, честно говоря, не знаю что за интересный объект Dialog, а судя по рисункам текста в этих окнах нет.

Это сообщение отредактировал(а) Keeper89 - 4.6.2009, 23:34


--------------------
PM MAIL WWW   Вверх
Ergoz
Дата 4.6.2009, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 3.6.2009
Где: Россия

Репутация: нет
Всего: нет



программа на с++ просто была написана. наверное по этому. и этот компонент не может быть пустой.. вот я в полном замешательстве как вот выловить... я уже дня 4 мучаюсь с бубном... может можно сделать как нить проверку есть ли в Dialog'e класс ричэдит и читать из него? просто я в делфи нубик, и не знаю сделать поиск по окнам, поиск есть ли в окне компонент, и например есть ли в компоненте слово... кстати при загрузке программы в чате всегда есть пара стандартных строк, может по ним реально выловить для дальнейших логов?

я имею ввиду строки (скрин в 1 посте):
RFRudokop v1.3.7 by darkgrey / [email protected]
Coded special for www.rf-cheats.ru


эти 2 строки всегда появляются в окне чата, реально ли найти компонент по этим строкам в нём?

Это сообщение отредактировал(а) Ergoz - 4.6.2009, 23:44
PM MAIL ICQ   Вверх
Keeper89
Дата 4.6.2009, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Мне конечно программу эту хорошо бы, я бы посмотрел поближе smile


--------------------
PM MAIL WWW   Вверх
Ergoz
Дата 5.6.2009, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 3.6.2009
Где: Россия

Репутация: нет
Всего: нет



проблема в том что я её распространять не могу, она стоит 1700р, и привязывается к железу. Её чуть ли ни на всех кряк форумах пытались взломать, до сих пор за 2.5-3 года не смогли. Да и у меня репутация хорошая, и её терять не хочу. Да и не запустится она даже у тебя... так бы дал если бы была фришная.
PM MAIL ICQ   Вверх
Keeper89
Дата 5.6.2009, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Взломать можно все, но это так, отвлечение от темы smile smile 

Покопался, вот, пробуй код:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  H, PageHandle, TabHandle, REHandle: THandle;
  lpBuffer: PChar;
begin
  H := FindWindow(nil, PChar('RFRudokop ~~~~~~~~~~~~~'));
  if H <> 0 then
  begin
    PageHandle := FindWindowEx(H, 0, 'SysTabControl32', nil);
    if PageHandle <> 0 then
    begin
     TabHandle := FindWindowEx(PageHandle, 0, '#32770',nil);
     if TabHandle <> 0 then
     begin
        REHandle := FindWindowEx(TabHandle, 0, 'RichEdit20A', nil);
        if REHandle <> 0 then
        begin
          lpBuffer := GetMemory(1024);
          try
            SendMessage(REHandle, WM_GETTEXT, 1024, Integer(lpBuffer));
            RichEdit1.Text := lpBuffer;
          finally
            FreeMemory(lpBuffer);
          end;
        end;
      end;
    end;
  end;
end;


Это сообщение отредактировал(а) Keeper89 - 5.6.2009, 00:59


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0634 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.