Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];

Вниз

Как получить текст из 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.01 c
6-1117384168
Новичек
2005-05-29 20:29
2005.09.18
Создание и обработка событий сокета.


14-1124811657
Windows
2005-08-23 19:40
2005.09.18
Следить за процессом закачки файла по GUAGE


2-1123671728
Novice
2005-08-10 15:02
2005.09.18
указатели


14-1124954247
Некто
2005-08-25 11:17
2005.09.18
Высота букв в Word 2003


4-1122246995
timon84
2005-07-25 03:16
2005.09.18
Отловить нажатие кнопки пуск





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский