Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.18;
Скачать: CL | DM;

Вниз

Как получить текст из SysListView32   Найти похожие ветки 

 
Хинт ©   (2005-07-26 11:45) [0]

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


 
alpet ©   (2005-07-26 11:51) [1]

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

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


 
Хинт ©   (2005-07-26 12:06) [2]

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


 
Хинт ©   (2005-07-26 12:22) [3]

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


 
Хинт ©   (2005-07-26 14:29) [4]

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

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;


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


 
begin...end ©   (2005-07-26 14:33) [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:39) [6]

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


 
Хинт ©   (2005-07-26 15:14) [7]

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


 
alpet ©   (2005-07-26 15:19) [8]

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


 
Хинт ©   (2005-07-26 18:58) [9]

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



Страницы: 1 вся ветка

Текущий архив: 2005.09.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.045 c
14-1124667340
Zer0
2005-08-22 03:35
2005.09.18
Quake 3 Engine Sources GPL ed


6-1117176041
Poul
2005-05-27 10:40
2005.09.18
Обработка Ping-ов


2-1123826523
syte_ser78
2005-08-12 10:02
2005.09.18
Почему и как исправить?


6-1117455483
Flame
2005-05-30 16:18
2005.09.18
proxy


3-1123565477
Shopot
2005-08-09 09:31
2005.09.18
ADO Query и SQL Server. Проблемы с памятью.