Как прочитать данные первой колонки из TVirtualStringTree, зная его Handle. Для ListView делал так (правда в чужом процессе):
| Код | procedure GetSnapshotListView(hwndRemoteSysListView: HWND); var i: integer; begin
// Получаем количество элементов nItemCount := ListView_GetItemCount(hwndRemoteSysListView);
// Получаем ID процесса, которому принадлежит найденное окно GetWindowThreadProcessId(hwndRemoteSysListView, &dwProcessID); if dwProcessID = 0 then ExitProcess(GetLastError);
// Открываем процесс hProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwProcessID); if hProcess = 0 then ExitProcess(GetLastError);
// Выделяем в нем память под текстовый буфер pszText := VirtualAllocEx(hProcess, nil, cchTextMax, MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE); if GetLastError <> 0 then ExitProcess(GetLastError);
// Выделяем в нем память под структуру LVITEM plviRemoteLVItem := VirtualAllocEx(hProcess, nil, SizeOf(LV_ITEM), MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE); if GetLastError <> 0 then ExitProcess(GetLastError);
// Заполняем структуру ZeroMemory(@lviRemoteLVItem, SizeOf(LV_ITEM)); lviRemoteLVItem.mask := LVIF_STATE or LVIF_TEXT; lviRemoteLVItem.pszText := pszText; lviRemoteLVItem.cchTextMax := cchTextMax;
// Пишем ее в память удаленного процесса if not WriteProcessMemory(hProcess, plviRemoteLVItem, @lviRemoteLVItem, SizeOf(LV_ITEM), dwBytesWriten) then ExitProcess(GetLastError);
// Получаем текст со всех элементов for I := 0 to nItemCount - 1 do begin // Отправляем сообщение с указателем на выделенный буфер nTextLength := SendMessage(hwndRemoteSysListView, LVM_GETITEMTEXT, I, Integer(plviRemoteLVItem));
// Читаем результат ZeroMemory(@svText, cchTextMax); ReadProcessMemory(hProcess, lviRemoteLVItem.pszText, @svText[1], nTextLength, dwBytesWriten);
Writeln(PChar(@svText[1])); end;
// Освобождаем ранее выделенную память VirtualFreeEx(hProcess, pszText, 0, MEM_RELEASE); VirtualFreeEx(hProcess, plviRemoteLVItem, 0, MEM_RELEASE);
// Закрываем описатель процесса CloseHandle(hProcess); end;
|
|