Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.07.2014, 17:04   #1
fedorov2012
Пользователь
 
Регистрация: 05.01.2013
Сообщений: 61
Вопрос Как получить данные из TVirtualStringTree, зная его Handle?

Как прочитать данные первой колонки из 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;
fedorov2012 вне форума Ответить с цитированием
Старый 03.07.2014, 17:29   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Для этого нужно знать какими сообщениями она оперирует.
Откуда данные наполняют этот компонент известно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.07.2014, 19:06   #3
fedorov2012
Пользователь
 
Регистрация: 05.01.2013
Сообщений: 61
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Откуда данные наполняют этот компонент известно?
Не совсем понятен вопрос - просто внутри кода идет заполнение экземпляра TVirtualStringTree (как если бы мы заполняли ListView, TreeView)
fedorov2012 вне форума Ответить с цитированием
Старый 03.07.2014, 19:08   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
внутри кода идет заполнение экземпляра TVirtualStringTree
А откуда код берет эти данные? Из базы? Из файла? Из сети?
Что является источником данных для компонента?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.07.2014, 19:13   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Как прочитать данные первой колонки из TVirtualStringTree, зная его Handle.
Предположу, что никак. TVirtualStringTree вообще не компонент системы. И данныt там живут физически только на момент их получения из источника в GetText методе, т.е. PVirtualNode.Data.
Человек_Борща вне форума Ответить с цитированием
Старый 03.07.2014, 19:34   #6
fedorov2012
Пользователь
 
Регистрация: 05.01.2013
Сообщений: 61
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Предположу, что никак. TVirtualStringTree вообще не компонент системы. И данныt там живут физически только на момент их получения из источника в GetText методе, т.е. PVirtualNode.Data.
Но где то же эти данные висят в памяти - как достучаться до этого места?
fedorov2012 вне форума Ответить с цитированием
Старый 03.07.2014, 19:55   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Но где то же эти данные висят в памяти - как достучаться до этого места?
В том то и дело что никак Я же скал где это место. Каждый элемент дерева это PVirtualNode, у которого есть указатель на данные: PVirtualNode.Data. размер этих данных может быть абсолютно любым. И эти же данные могут прекращать существовать после первого вызова GetText.
Человек_Борща вне форума Ответить с цитированием
Старый 03.07.2014, 20:01   #8
fedorov2012
Пользователь
 
Регистрация: 05.01.2013
Сообщений: 61
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
могут прекращать существовать после первого вызова GetText.
Если бы они прекращали существовать, то тогда откуда бы брались данные в случае скроллинга по VirtualStringTree?

Последний раз редактировалось fedorov2012; 03.07.2014 в 20:06.
fedorov2012 вне форума Ответить с цитированием
Старый 03.07.2014, 20:09   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Если бы они прекращали существовать, то тогда откуда бы брались данные в случае скроллинга по VirtualStringTree?
Создавались бы снова, заполняли компонент и сваливали дальше. Нефиг память занимать. Такое не исключено ибо вполне реализуемо.
В вашем коде, за вас большую часть работы делает система т.к. SysListView это системный компонент. Более того LV_ITEM по себе связан с колонками в предке, не смотря на наличие того же data.

У PVirtualNode нет ни Caption ни Subitems. Есть только Data. Да и то не факт, что там не PmyVData = class(PVirtualNode)

Последний раз редактировалось Человек_Борща; 03.07.2014 в 20:13.
Человек_Борща вне форума Ответить с цитированием
Старый 03.07.2014, 20:29   #10
fedorov2012
Пользователь
 
Регистрация: 05.01.2013
Сообщений: 61
По умолчанию

Попробовал и так: руками выделил вручную все элементы, а затем программно послал это сообщение
и послал команду SendMessage(hwndRemoteVirtualString Tree, WM_COPY, 0, 0);
но в буфер ничего не попало, странно

Последний раз редактировалось fedorov2012; 03.07.2014 в 20:31.
fedorov2012 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как зная ProcessID получить Handle главной формы? NikLik Win Api 8 27.08.2021 21:29
Как узнать путь к приложению, зная его Handle? Night_Devil Общие вопросы Delphi 4 17.03.2012 01:26
Как найти название класса процеса зная его handle? Dazz Win Api 3 16.03.2010 11:35
Как нажать на Button в чужом приложении зная его HANDLE SeRhy Win Api 2 04.02.2009 13:43
Как получить handle главного окна, зная имя приложения? Altera Win Api 8 22.12.2008 18:52