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

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

Как получить текст из SysListView32


Хинт ©   (2005-07-26 11:45:00) 

WM_GETTEXT не работает
Посоветуйте возможные пути решения.


Хинт   (2005-07-26 18:58:00) [1]

Огромное спасибо. Разобрался.


alpet   (2005-07-26 15:19:00) [2]

Хинт ©   (26.07.05 15:14) [7]
Получаешь из первого, потом из второго. Т.е. iSubItem = 0 и 1.


Хинт   (2005-07-26 15:14:00) [3]

В моем случае имеются только 2 столбца. Как мне получить текст из обоих?


Хинт   (2005-07-26 14:39:00) [4]

2begin...end
Спасибо за ответ, но я не совсем понимаю как работает этот код, поэтому нельзя ли объяснит немного поподробнее?


begin...end   (2005-07-26 14:33:00) [5]

> Хинт ©   (26.07.05 14:29) [4]

> // Заполнение структуры LV_ITEM
> with Data.Item do
> begin
>   iSubItem := 0;

> Как обратиться ко всем остальным ячейкам?

The iSubItem member specifies the index of a subitem, or it can be zero to get the item label.


Хинт   (2005-07-26 14:29:00) [6]

Вот что у меня получилось:

procedure GetText(ListWND: HWND);
const
 PROCESS_ACCESS = PROCESS_VM_OPERATION or PROCESS_VM_READ or
   PROCESS_VM_WRITE;
type
 PProcData = ^TProcData;
 TProcData = record
   Item: TLVItemA;
   Txt: packed array[0..1023] of AnsiChar;
   ItemRect: TRect;
 end;
var
 Cnt, I: Integer;
 ProcID: DWORD;
 ProcessHandle: THandle;
 Data: TProcData;
 RemoteProcData: PProcData;
 Res: Boolean;
 LI: TListItem;
 ColWid: Integer;
 pt: TPoint;
begin
 // Получение PID процесса
 ProcID := 0;
 GetWindowThreadProcessId(ListWND, ProcID);
 if ProcId = 0 then
 begin
   MessageDlg('Cannot retrieve process ID.', mtError, [mbOK], 0);
   Exit;
 end;

 // Открытие доступа к стороннему процессу
 ProcessHandle := OpenProcess(PROCESS_ACCESS, False, ProcID);
 if ProcessHandle = 0 then RaiseLastOSError;
 try
   // Выделение памяти в ВАП нужного нам процесса
   RemoteProcData := VirtualAllocEx(ProcessHandle, nil,
     SizeOf(RemoteProcData^), MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
   if RemoteProcData = nil then RaiseLastOSError;
   try
     Cnt := ListView_GetItemCount(ListWND); // Получение кол-ва иконок
     for I := 0 to Cnt - 1 do
     begin
       FillChar(Data, SizeOf(Data), 0); // Обнуление структуры

       // Заполнение структуры LV_ITEM
       with Data.Item do
       begin
         iSubItem := 0;
         pszText := @RemoteProcData^.Txt;
         cchTextMax := SizeOf(RemoteProcData^.Txt) - 1;
       end;

       // Копирование структуры из нашего приложения в чужое
       Res := WriteProcessMemory(ProcessHandle, RemoteProcData,
         @Data, SizeOf(Data), PLongWord(nil)^);
       if not Res then RaiseLastOSError;

       // Получение текста
       SendMessage(ListWND, LVM_GETITEMTEXT, I, LPARAM(@RemoteProcData^.Item));

       // Получение координат прямоугольника
       SendMessage(ListWND, LVM_GETITEMRECT, I, LPARAM(@RemoteProcData^.ItemRect));

       // Чтение полученных данных из чужого ВАП в наш
       Res := ReadProcessMemory(ProcessHandle, RemoteProcData,
         @Data, SizeOf(Data), PLongWord(nil)^);
       if not Res then RaiseLastOSError;

       // Добавление параметров в Memo
       Form1.Memo1.Lines.Add(data.txt)
     end;
   finally
     // Освобождение памяти
     Res := LongBool(VirtualFreeEx(ProcessHandle, RemoteProcData,
       0, MEM_RELEASE));
     if not Res then RaiseLastOSError;
   end;
 finally
   // Закрытие дескриптора
   CloseHandle(ProcessHandle);
 end;

end;


Но данный вариант получает текст только из первого столбца. Как обратиться ко всем остальным ячейкам?


Хинт   (2005-07-26 12:22:00) [7]

Ничего не могу найти :( Все примеры на сохранение позиций значков Desktop'а и восстановление их...


Хинт   (2005-07-26 12:06:00) [8]

Большое спасибо. Сам я в этом не разберусь, но зато теперь знаю что конкретно мне искать.


alpet   (2005-07-26 11:51:00) [9]

Оригиналоный способ:)

Сообщение должно быть LVM_GETITEMTEXТ. Если указанный контрол еще и в другом процессе - сначала потребуется выделить в АП того процесса немного памяти (VirtualAllocEx), и потом скопировать в АП своего (ReadProcessMemory).


Наверх

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