Считать TreeView чужого процесса
От: barboss  
Дата: 19.11.19 14:38
Оценка:
Нужно получить структуру дерева чужой программы.
Обсуждалось тут https://www.sql.ru/forum/210543/izvlechenie-informacii-iz-chuzhogo-treeview
но так и не нашли решение

Обходим узлы первого уровня, но вот в текст TreeItem получить не выходит. Возвращается пустая строка.
Может кто сталкивался с подобным? В чём может быть проблема?

 procedure GetItemsText(hTreeView:hwnd);
 var hProcess:LongInt;
     pMem1, pMem2:Pointer;
     pID:Cardinal;
     tWindow:LongInt;
     w: QWord;
     hItem:HTREEITEM;
     tvi:TV_ITEM;
     s:string;

 begin
   tWindow := GetParent(hTreeView);
   while GetParent(tWindow) <> 0 do
     tWindow := GetParent(tWindow);

   // По этому дескриптору получаем ID процесса:
   GetWindowThreadProcessId(tWindow, pID);
   // Открываем процесс с правами записи и чтения:
   hProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, pID);

   // Если не получилось - выходим:
   if hProcess = 0 then Exit;
   // Резервируем кусок памяти в контексте процесса:

   pMem1 := nil;
   pMem2 := nil;

   pMem1 := VirtualAllocEx(hProcess, nil, SizeOf(tvi), MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
   pMem2 := VirtualAllocEx(hProcess, nil, 255, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);

   if (pMem1 <> nil) and (pMem2 <> nil) then
   // если получилось, то начинаем работу:
   // ==========================================================
   begin
     hItem := HTREEITEM(SendMessage(hTreeView, TVM_GETNEXTITEM, TVGN_ROOT, 0));
     while LongInt(hItem) <> 0 do
     begin
       SetLength(s, 255);
       FillChar(s[1], 255, #0);
       WriteProcessMemory(hProcess, pMem2, @s[1], 255, w);

       // заполняем поля структуры:
       tvi.hItem := hItem;
       tvi.mask := TVIF_TEXT + TVIF_HANDLE;
       tvi.cchTextMax := 255;
       tvi.pszText := @pMem2;

       // копируем структуру в память процесса:
       WriteProcessMemory(hProcess, pMem1, @tvi, SizeOf(tvi), w);
       // посылаем сообщение дереву:
       SendMessage(hTreeView, TVM_GETITEM, 0, Int64(pMem1));
       // копируем строку-результат обратно в свою память:
       ReadProcessMemory(hProcess, pMem2, @s[1], 255, w);

       // выводим ее
       Form1.Memo1.Lines.Append(inttostr(LongInt(hitem))+':'+s);
       // переходим к следующему:
       hItem :=HTREEITEM( SendMessage(hTreeView, TVM_GETNEXTITEM, TVGN_NEXT, LongInt(hItem)));
     end;
     // =========================================================
     VirtualFreeEx(hProcess, pMem1, 0, MEM_RELEASE);
     VirtualFreeEx(hProcess, pMem2, 0, MEM_RELEASE);
     // Закрываем процесс:
    // CloseHandle(hProcess);
   end;
 end;
winapi treeview laza
Re: Считать TreeView чужого процесса
От: LuciferNovoros Россия  
Дата: 20.11.19 05:54
Оценка:
Здравствуйте, barboss, Вы писали:

B>Обходим узлы первого уровня, но вот в текст TreeItem получить не выходит. Возвращается пустая строка.

B>Может кто сталкивался с подобным? В чём может быть проблема?

Потому что:

This message will return NULL if the item being retrieved is the root node of the tree. For example, if you use this message with the TVGN_PARENT flag on a first-level child of the tree view's root node, the message will return NULL.


Просто читая документацию.
Re[2]: Считать TreeView чужого процесса
От: barboss  
Дата: 20.11.19 10:22
Оценка:
Здравствуйте, LuciferNovoros, Вы писали:
LN>Потому что:

LN>

This message will return NULL if the item being retrieved is the root node of the tree. For example, if you use this message with the TVGN_PARENT flag on a first-level child of the tree view's root node, the message will return NULL.


Некорневые тоже не возвращает
Re: Считать TreeView чужого процесса
От: Leonid Troyanovsky  
Дата: 21.11.19 06:50
Оценка:
Здравствуйте, barboss, Вы писали:

B>Обсуждалось тут https://www.sql.ru/forum/210543/izvlechenie-informacii-iz-chuzhogo-treeview

B>но так и не нашли решение

А оно есть?
Сказали жеж, что наверняка TcxDBTreeList не обязан работать с TVM_*.
В ресурсах-то покопался?
--
С уважением, LVT
Re[2]: Считать TreeView чужого процесса
От: barboss  
Дата: 21.11.19 07:40
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT>А оно есть?

LT>Сказали жеж, что наверняка TcxDBTreeList не обязан работать с TVM_*.
LT>В ресурсах-то покопался?

Эта ссылка просто для примера. Дело было в 2005 году, возможно, решение и появилось.
Уточню, что конкретно мне это нужно под windows10.
Не являюсь спецом по winapi и уверен, здесь такие найдутся)
Re[3]: Считать TreeView чужого процесса
От: Leonid Troyanovsky  
Дата: 21.11.19 15:05
Оценка:
Здравствуйте, barboss, Вы писали:

B>Эта ссылка просто для примера. Дело было в 2005 году, возможно, решение и появилось.


Как зовут класс окна оного контрола?
Что рассказывает spy о обрабатываемых сообщениях?
--
С уважением, LVT
Re[4]: Считать TreeView чужого процесса
От: barboss  
Дата: 22.11.19 08:39
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT>Как зовут класс окна оного контрола?

LT>Что рассказывает spy о обрабатываемых сообщениях?

Это обычный TreeView. Откликается на TVM_GETNEXTITEM, TVM_DELETEITEM, TVM_EXPAND и т.д.
Чужая прога на PowerBuilder, ейный класс зовётся PBTreeView32_90.
Вряд ли это что-то даст, да и было бы интересно найти универсальный способ чтения текста итемов.
Re[5]: Считать TreeView чужого процесса
От: LuciferNovoros Россия  
Дата: 22.11.19 11:59
Оценка:
Здравствуйте, barboss, Вы писали:

B>Это обычный TreeView. Откликается на TVM_GETNEXTITEM, TVM_DELETEITEM, TVM_EXPAND и т.д.


Я бы не сказал, что это обычный TreeView. Ибо реализация у него вроде как кроссплатформенная. И он реально не обязан реагировать на виндовые месседжи.

А что дает TVM_GETNEXTITEM, когда ты к нему обращаешься? Точно он возвращает не NULL?
Re[6]: Считать TreeView чужого процесса
От: barboss  
Дата: 22.11.19 12:05
Оценка:
Здравствуйте, LuciferNovoros, Вы писали:

LN>Здравствуйте, barboss, Вы писали:


B>>Это обычный TreeView. Откликается на TVM_GETNEXTITEM, TVM_DELETEITEM, TVM_EXPAND и т.д.


LN>Я бы не сказал, что это обычный TreeView. Ибо реализация у него вроде как кроссплатформенная. И он реально не обязан реагировать на виндовые месседжи.


LN>А что дает TVM_GETNEXTITEM, когда ты к нему обращаешься? Точно он возвращает не NULL?


точно
Re[7]: Считать TreeView чужого процесса
От: LuciferNovoros Россия  
Дата: 22.11.19 12:33
Оценка:
Здравствуйте, barboss, Вы писали:

B>точно


Надо рабочий пример. Так тебе никто не скажет.
Re: Считать TreeView чужого процесса
От: kov_serg Россия  
Дата: 22.11.19 12:43
Оценка:
Здравствуйте, barboss, Вы писали:

B>Нужно получить структуру дерева чужой программы.

B>Обсуждалось тут https://www.sql.ru/forum/210543/izvlechenie-informacii-iz-chuzhogo-treeview
B>но так и не нашли решение

B>Обходим узлы первого уровня, но вот в текст TreeItem получить не выходит. Возвращается пустая строка.

B>Может кто сталкивался с подобным? В чём может быть проблема?

Обычно еще делают AttachThreadInput
Re[8]: Считать TreeView чужого процесса
От: barboss  
Дата: 22.11.19 13:21
Оценка:
Здравствуйте, LuciferNovoros, Вы писали:

LN>Здравствуйте, barboss, Вы писали:


B>>точно


LN>Надо рабочий пример. Так тебе никто не скажет.


Дык я и привёл рабочий. Возвращаются дескрипторы итемов корня дерева.
Если допилить рекурсию, прекрасно получаем всю иерархию.
А вот TreeNode.Text не получаем
Re[9]: Считать TreeView чужого процесса
От: LuciferNovoros Россия  
Дата: 22.11.19 13:33
Оценка:
Здравствуйте, barboss, Вы писали:

B>Дык я и привёл рабочий. Возвращаются дескрипторы итемов корня дерева.

B>Если допилить рекурсию, прекрасно получаем всю иерархию.
B>А вот TreeNode.Text не получаем

Это — нерабочий пример. Это просто кусок кода. Где я возьму прогу, сделанную в PowerBuilder, чтоб проверить? К чему прицепиться? В штатном DBTreeView все работает.
Re[10]: Считать TreeView чужого процесса
От: barboss  
Дата: 22.11.19 14:13
Оценка:
LN>В штатном DBTreeView все работает.

Всё — это мне много. Мне бы пример получения текста три-нодов чужой проги. И бог с ним с пауэрбилдером.
Отредактировано 22.11.2019 15:35 barboss . Предыдущая версия .
Re: Считать TreeView чужого процесса
От: Leonid Troyanovsky  
Дата: 23.11.19 06:08
Оценка:
Здравствуйте, barboss, Вы писали:

B> tvi.pszText := @pMem2;


tvi.pszText := pMem2;
--
С уважением, LVT
Re: Считать TreeView чужого процесса
От: LuciferSaratov Россия  
Дата: 23.11.19 07:06
Оценка:
Здравствуйте, barboss, Вы писали:

B>Нужно получить структуру дерева чужой программы.


IAccessible/IAccessible2 там не поддерживается случайно?
Re[2]: Считать TreeView чужого процесса
От: barboss  
Дата: 25.11.19 08:10
Оценка:
LS>IAccessible/IAccessible2 там не поддерживается случайно?

Вряд ли. Ole серверов с этой прогой нет по крайней мере. А в Lazarus нет модуля Oleacc
Но спасибо за наводку
Re[2]: Считать TreeView чужого процесса
От: barboss  
Дата: 25.11.19 08:10
Оценка:
мимо
Re[3]: Считать TreeView чужого процесса
От: Leonid Troyanovsky  
Дата: 26.11.19 08:36
Оценка:
Здравствуйте, barboss, Вы писали:

B>мимо


ложь
--
С уважением, LVT
Re[4]: Считать TreeView чужого процесса
От: barboss  
Дата: 26.11.19 09:52
Оценка:
истинно так. пустая строка. странно
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.