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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Текст из Label, Дискриптор метки 
:(
    Опции темы
Sentynel
  Дата 30.4.2006, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 20.12.2004
Где: Deutschland, Cell e

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



Всем привет!  smile 

Требуется помощь для извлечения текста Label из чужой программы.
Использую FindWindowEx но дескриптор Label не определяется.
Может кто знает решение этой задачи, желательно с примером для ясности. 

Заранее спасибо!!!  smile  
PM MAIL ICQ   Вверх
Romikgy
Дата 30.4.2006, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Имхо 
Цитата(Sentynel @  30.4.2006,  13:58 Найти цитируемый пост)
 Label

не является окном и у него нет хендела, это просто картинка на окне , и текст просто с него ты не вытащишь 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Sentynel
Дата 30.4.2006, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 20.12.2004
Где: Deutschland, Cell e

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



Тогда каким образом можно взять этот же текст из ListView ? smile  
PM MAIL ICQ   Вверх
Romikgy
Дата 30.4.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Дык 
Цитата(Sentynel @  30.4.2006,  15:44 Найти цитируемый пост)
ListView

не есть 
Цитата(Sentynel @  30.4.2006,  13:58 Найти цитируемый пост)
Label

И листвью это окно , там можно многое smile
Что конкретно нужно то? 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Sentynel
Дата 30.4.2006, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 20.12.2004
Где: Deutschland, Cell e

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



Конкретно ситуация такая.
Имеется список ListView с графами имя, время, город,.....
Активная строка списка отображается в текстах Label-ей ,
необходимо получить текст активной строки из графы "Время".  smile  
PM MAIL ICQ   Вверх
Romikgy
Дата 30.4.2006, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Имхо легче попросить отдать 
Цитата(Sentynel @  30.4.2006,  16:02 Найти цитируемый пост)
Активная строка

у
Цитата(Sentynel @  30.4.2006,  16:02 Найти цитируемый пост)
 ListView

типа такого ListView_GetItemText, 
чем пытатся чтото взять у 
Цитата(Sentynel @  30.4.2006,  16:02 Найти цитируемый пост)
Label

 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Sentynel
Дата 1.5.2006, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 20.12.2004
Где: Deutschland, Cell e

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



А пример можно для наглядности ? smile  
PM MAIL ICQ   Вверх
Yanis
Дата 1.5.2006, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Sentynel @  1.5.2006,  18:23 Найти цитируемый пост)
А пример можно для наглядности ?

Код

var
  s: PChar;
begin
  { выделяем память под строку }
  GetMem(s, MAX_PATH);
  { в s запишется текст 3-го (2+1) Item'а (а точнее текст Item'а из первой (0) колонки) }
  ListView_GetItemText(lv1.Handle, 2, 0, s, MAX_PATH);
  ShowMessage(s);
  { освобождаем память, когда строка уже не нужна }
  FreeMem(s);
end;


Добавлено @ 20:01 
P. S. Большой пример писать сейчас нету времени smile  


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Sentynel
Дата 5.5.2006, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 20.12.2004
Где: Deutschland, Cell e

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



Что то по началу писал кракозяблики, а теперь ничего непишет типа строка пустая .  smile 
 
PM MAIL ICQ   Вверх
Rouse_
Дата 5.5.2006, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Sentynel, потому что данный код будет работать только в пределах адресного пространства вызывающего приложения. Изучайте матчасть, по приходу LVM_GETITEMTEXT данные ложаться в структуру под которую выделена память в адрессном пространстве процесса. Приведенным выше кодом получить можно только данные из собственного ListView; 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Yanis
Дата 6.5.2006, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Rouse_ @  5.5.2006,  22:33 Найти цитируемый пост)
Sentynel, потому что данный код будет работать только в пределах адресного пространства вызывающего приложения. Изучайте матчасть, по приходу LVM_GETITEMTEXT данные ложаться в структуру под которую выделена память в адрессном пространстве процесса. Приведенным выше кодом получить можно только данные из собственного ListView;  

Блин, не знал. 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Rouse_
Дата 6.5.2006, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Smailik
Дата 16.5.2006, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Rouse_ @  6.5.2006,  10:51 Найти цитируемый пост)
Yanis, этот момент был упомянут у Рихтера


а шде именно он был упомянут? у меня похожие грабли smile
 
PM MAIL   Вверх
Nickel
Дата 17.5.2006, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Пожалуйста, написал код, который позволяет брать текст любого листвью:
Код

type
  TRemoteInfo = record
    LoadLibrary: function(lpLibFileName: PChar): HMODULE; stdcall;
    GetProcAddress: function(hModule: HMODULE;
                             lpProcName: LPCSTR): FARPROC; stdcall;
    Kernel32      : array[0..16] of Char;
    nExitThread   : array[0..16] of Char;
    nVirtualAlloc : array[0..16] of Char;
    Size          : Cardinal;
    Res           : Pointer;
  end;

function InjectMemory(Process: dword; Memory: pointer; Size: dword): pointer;
begin
  Result := VirtualAllocEx(Process, nil, Size, MEM_COMMIT or MEM_RESERVE,
                                               PAGE_EXECUTE_READWRITE);
  WriteProcessMemory(Process, Result, Memory, Size, DWORD(nil^));
end;


procedure RemoteThread(RemoteInfo: pointer); stdcall;
var
  ExitThread   : procedure(uExitCode: UINT); stdcall;
  VirtualAlloc : function(lpvAddress: Pointer; dwSize, flAllocationType,
                                          flProtect: DWORD): Pointer; stdcall;
begin
  with TRemoteInfo(RemoteInfo^) do
  begin
    @VirtualAlloc := GetProcAddress(LoadLibrary(Kernel32), nVirtualAlloc);
    @ExitThread := GetProcAddress(LoadLibrary(Kernel32), nExitThread);
    Res:=VirtualAlloc(nil, Size, MEM_COMMIT or MEM_RESERVE,
                                                       PAGE_EXECUTE_READWRITE);
    ExitThread(0);
  end;
end;

procedure RemoteThreadEnd; begin end;

function AllocMem(Process, Size: Cardinal):Pointer;
var
  TID            : cardinal;
  RemoteInfo     : TRemoteInfo;
  pInfo, CodeAdr : pointer;
begin
  ZeroMemory(@RemoteInfo, SizeOf(RemoteInfo));
  @RemoteInfo.LoadLibrary    := GetProcAddress(GetModuleHandle('kernel32.dll'),
                                               'LoadLibraryA');
  @RemoteInfo.GetProcAddress := GetProcAddress(GetModuleHandle('kernel32.dll'),
                                               'GetProcAddress');
  RemoteInfo.Size:= Size;
  RemoteInfo.Kernel32:= 'kernel32.dll';
  RemoteInfo.nVirtualAlloc:= 'VirtualAlloc';
  RemoteInfo.nExitThread:= 'ExitThread';
  pInfo := InjectMemory(Process, @RemoteInfo, SizeOf(TRemoteInfo));
  CodeAdr := InjectMemory(Process, @RemoteThread,
                          dword(@RemoteThreadEnd) - dword(@RemoteThread));
  CreateRemoteThread(process, nil, 0, CodeAdr, pInfo, 0, TID);
  //WaitForSingleObject(TID, INFINITE);
  {А вот здесь у меня лыжи не едут или я... WaitForSingleObject возвращает
  WAIT_FAILED, а GetLastError 1447 - ERROR_NO_SCROLLBARS =))) }
  sleep(0);
  ReadProcessMemory(Process, pInfo, @RemoteInfo, SizeOf(RemoteInfo), DWORD(nil^));
  Result:= RemoteInfo.Res;
end;

procedure ListView_GetItemTextEx (wnd: HWND; i, iSubItem: Integer;
                                  pszText: PChar; cchTextMax: Integer);
var
  Text, p : Pointer;
  Process : Cardinal;
  Item    : TLVItemA;
begin
  GetWindowThreadProcessId(wnd,process);
  Process:= OpenProcess(PROCESS_VM_READ or PROCESS_VM_WRITE or
                  PROCESS_VM_OPERATION or PROCESS_CREATE_THREAD,false,process);
  Text:= AllocMem(Process, cchTextMax);
  p:= AllocMem(Process, SizeOf(TLVItemA));
  Item.iSubItem:= iSubItem;
  Item.cchTextMax:= cchTextMax;
  Item.pszText:= Text;
  WriteProcessMemory(Process, p, @Item, SizeOf(TLVItemA), DWORD(nil^));
  SendMessage(wnd, LVM_GETITEMTEXT, i, Longint(p));
  ReadProcessMemory(Process, Text, pszText, cchTextMax, DWORD(nil^));
end;

.....

procedure TForm1.Button1Click(Sender: TObject);
var
  a : array[1..MAX_PATH] of Char;
begin
  ListView_GetItemTextEx (FindWindowEx (FindWindow (nil, 'Форма с листвью',
                                     0,'TListView',nil), 0, 0, @a, MAX_PATH);
  ShowMessage(a);
end;


Как работает: внедряем поток в чужой процесс, который выделят память, просим ListView послать данные в эту область памяти и читаем их оттуда. Как видите есть небольшая проблемка с WaitForSingleObject.
ЗЫ: мож в арсенал форумистов добавить или в DRKB? 
PM   Вверх
Rouse_
Дата 17.5.2006, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А зачем заморочки с CreateRemoteThread? 
Он там не к месту - банально выделяем память и читаем оттуда...
Пример в соседней ветке про RichView
ЗЫ: кстати в твоем примере выделенную память Пушкин будет освобождать? smile 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0891 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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