Обходим узлы первого уровня, но вот в текст 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;
Здравствуйте, 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.
Здравствуйте, 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.
Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>А оно есть? LT>Сказали жеж, что наверняка TcxDBTreeList не обязан работать с TVM_*. LT>В ресурсах-то покопался?
Эта ссылка просто для примера. Дело было в 2005 году, возможно, решение и появилось.
Уточню, что конкретно мне это нужно под windows10.
Не являюсь спецом по winapi и уверен, здесь такие найдутся)
Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>Как зовут класс окна оного контрола? LT>Что рассказывает spy о обрабатываемых сообщениях?
Это обычный TreeView. Откликается на TVM_GETNEXTITEM, TVM_DELETEITEM, TVM_EXPAND и т.д.
Чужая прога на PowerBuilder, ейный класс зовётся PBTreeView32_90.
Вряд ли это что-то даст, да и было бы интересно найти универсальный способ чтения текста итемов.
Здравствуйте, LuciferNovoros, Вы писали:
LN>Здравствуйте, barboss, Вы писали:
B>>Это обычный TreeView. Откликается на TVM_GETNEXTITEM, TVM_DELETEITEM, TVM_EXPAND и т.д.
LN>Я бы не сказал, что это обычный TreeView. Ибо реализация у него вроде как кроссплатформенная. И он реально не обязан реагировать на виндовые месседжи.
LN>А что дает TVM_GETNEXTITEM, когда ты к нему обращаешься? Точно он возвращает не NULL?
Здравствуйте, barboss, Вы писали:
B>Нужно получить структуру дерева чужой программы. B>Обсуждалось тут https://www.sql.ru/forum/210543/izvlechenie-informacii-iz-chuzhogo-treeview B>но так и не нашли решение
B>Обходим узлы первого уровня, но вот в текст TreeItem получить не выходит. Возвращается пустая строка. B>Может кто сталкивался с подобным? В чём может быть проблема?
Здравствуйте, LuciferNovoros, Вы писали:
LN>Здравствуйте, barboss, Вы писали:
B>>точно
LN>Надо рабочий пример. Так тебе никто не скажет.
Дык я и привёл рабочий. Возвращаются дескрипторы итемов корня дерева.
Если допилить рекурсию, прекрасно получаем всю иерархию.
А вот TreeNode.Text не получаем
Здравствуйте, barboss, Вы писали:
B>Дык я и привёл рабочий. Возвращаются дескрипторы итемов корня дерева. B>Если допилить рекурсию, прекрасно получаем всю иерархию. B>А вот TreeNode.Text не получаем
Это — нерабочий пример. Это просто кусок кода. Где я возьму прогу, сделанную в PowerBuilder, чтоб проверить? К чему прицепиться? В штатном DBTreeView все работает.