Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вытащить текст из компонента, находящегося в другой программе [D7, WinXP]


Chaser ©   (2005-06-02 11:20:00) 

Подскажите, как вытащить текст из компонента, находящегося в другой программе ('TListBox' и 'TListView').
С 'TEdit' и 'TMemo' все работает, а с этими почему то нет.

Код:

var
i: integer;
Wnd: hWnd;
WindowText: string;
TrayWnd, BtnWnd: hWnd; // для Button
Control: array [0..127] of char;
TxtLength, TxtLength1: integer;
buffer,bf: string;
begin
Wnd:=FindWindow(nil,PChar('Test');
if Wnd=0 then Exit;
Wnd:=GetWindow(Wnd,GW_CHILD);
GetClassName(Wnd,Control,SizeOf(Control));
// ищем нужный контрол
while Control<>'TListBox' do
 begin
  Wnd:=GetWindow(Wnd,GW_HWNDNEXT);
  GetClassName(Wnd,Control,SizeOf(Control));
  if Control='TListBox'
  then
   begin
    TxtLength:=SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0);
    TxtLength:=TxtLength+1;
    TxtLength1:=SendMessage(Wnd, LB_GETTEXTLEN, 0, 0);
    TxtLength1:=TxtLength1+1;
    SetLength(buffer, TxtLength);
    SetLength(bf, TxtLength1);
    SendMessage(Wnd,WM_GetText, TxtLength, longint(@buffer[1]));
    SendMessage(Wnd,LB_GetText, TxtLength1, longint(@bf[1]));
    Memo1.Text:=buffer;
    Memo1.Lines.Add(bf);
   end;
 end;
end;


Chaser   (2005-06-03 16:17:00) [1]

С ListBox'ом получилось,

SendMessage(Wnd,LB_GetText, 0, longint(@buffer_listbcom[1]));

теперь бы разобраться с TListView


Digitman   (2005-06-03 10:58:00) [2]


> С 'TEdit' и 'TMemo' все работает, а с этими почему то нет


и не будет работать, потому что буфер для приема текста листбокса должен быть в АП того процесса, которому принадлежит окно листбокса

- открой "чужой" процесс (OpenProcess) - получишь хэндл этого объекта,
- аллокируй в "чужом" АП буфер нужного размера (VirtualAllocEx) - получишь адрес этого "чужого" буфера,
- отправь "чужому" листбоксу сообщение LB_GetText, указав только что полученный тобой адрес "чужого" буфера
- скопируй содержимое "чужого" буфера в заранее подготовленный тобой "свой" буфер того же размера (ReadProcessMemory),
- уничтожь "чужой" буфер (VirtualFreeEx)
- закрой "чужой" процесс (CloseHandle)
- получи удовольствие)


Наверх

Титульная страница Поиск, карта сайта Написать письмо