![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить текст из 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).