-
Передо мной возникла следующая проблемка. Есть некое приложение (к сожалению, не моё). В нем используется визуальный компонент TTreeView. Мне надо узнать текст выделенного узла и его "вложенность" (1, 2, 3 ... n -ий уровень). До самого компонента TTreeView я то добрался (используя FindWindowEx) а вот дальше я не знаю как...
-
а дальше читать MSDN по поводу работы с ним. есть подозрение, что придётся код внедрять в чужое АП.
---
Understanding is not required. Only obedience.
-
Сообщение TVM_GETITEM в Win32 SDK или MSDN
-
-
Вот кусок кода, вроде бы правильно, но ничего не выводится в лейбле:
with tvItem do
begin
mask := TVIF_TEXT;
hItem := TreeView_GetSelection(hTreeView);
cchTextMax := 100;
end;
TreeView_GetItem(hTreeView, tvItem);
lblMeshText.Caption := tvItem.pszText;
Хендл верен
-
>[4] Master_Of_Puppets (2008-02-08 11:52:00)
ты [3] внимательно прочёл? или по ссылкам ходить — дело не барское?
---
Understanding is not required. Only obedience.
-
tvItem.pszText тоже нужно заполнять. Заполнять указателем, который, как тебя уже ткнул носом г-н Кетмарь, возвернёт функция VirtualAlloc (хотя по мне GlobalAlloc предпочтительнее).
-
Удалено модератором
-
Я думал, что нужен лиш код, который я привел в [4]. Пробывал сделать так как там, но Делфи ругается на хендл вот тут:
procedure ReadItemFromBuff(var Item: TTVITEM);
var Readed: DWORD;
begin
--> Win32Check(ReadProcessMemory(hTreeView, aRemBuff, @Item, SizeOf(Item), Readed));
Win32Check(Readed = SizeOf(Item));
end;
А можно сделать другим способом (чуточку проще) или это единственный?
Пробывал еще вот так (с учетом замечания [7]), но не работает:
var str : String
...
with tvItem do
begin
mask := TVIF_TEXT;
hItem := TreeView_GetSelection(hTreeView);
cchTextMax := 100;
pszText := @str;
end;
TreeView_GetItem(hTreeView, tvItem);
lblCap.Caption := str;
-
>[8] Master_Of_Puppets (2008-02-08 17:43:00)
бросай ты это дело. «Парфеша, куда тебе целоваться-то, ты ведь облеванный весь!» (ц) Даун Хаус
---
Understanding is not required. Only obedience.
-
Удалено модератором
-
Удалено модератором
-
> LongInt(pszText) := GlobalAlloc(GMEM_FIXED, TSZ);
а почему не pszText := PChar(GlobalAlloc(GMEM_FIXED, TSZ)) ?
-
> а почему не pszText := PChar(GlobalAlloc(GMEM_FIXED, TSZ)
> ) ?
А какая сопстно разница? так или иначе - работает, окоянное :)
-
> [6] Dib@zol © (08.02.08 12:24)
> tvItem.pszText тоже нужно заполнять. Заполнять указателем,
> который, как тебя уже ткнул носом г-н Кетмарь, возвернёт
> функция VirtualAlloc (хотя по мне GlobalAlloc предпочтительнее).
LPVOID VirtualAllocEx(
HANDLE hProcess,
...
VirtualAllocEx function reserves or commits a region of memory within the virtual address space of a specified process
vs
HGLOBAL GlobalAlloc(
UINT uFlags,
SIZE_T dwBytes
);
ничего не смущает?
-
The GlobalAlloc function allocates the specified number of bytes from the heap.
Heap, в котором размещаем, надо считать, принадлежит вызывающему процессу. Или я опять чего-то невкурил? Ну тады просвещайте меня, тёмного :(
-
> Heap, в котором размещаем, надо считать, принадлежит вызывающему
> процессу
беда в том, что дерево в другом
-
Удалено модератором
-
>[15] Dib@zol © (2008-02-08 18:21:00)
невнимательно. [0]: «Есть некое приложение (к сожалению, не моё)». отсюда однозначно следует, что процесс запущен и живёт в своём АП.
---
Understanding is not required. Only obedience.
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
>[20] Dib@zol © (2008-02-08 18:56:00)
так, FYI: обработчик WM_GETTEXT делает такие манипуляции для облегчения жизни функциям вида FindWindow().
---
Understanding is not required. Only obedience.
-
> так, FYI: обработчик WM_GETTEXT делает такие манипуляции
> для облегчения жизни функциям вида FindWindow().
эээ, што?
Нахрена, звиняюсь, он это (якобы) так делает? Вызов функции FindWindow предполагает то, что хендл окна неизвестен, а известен его текст. WM_GETTEXT - наоборот. Где тут "облегчение жизни"?? Ведь совместный вызов возможен только для специфических ситуаций.
Впрочем, прочитав подпись Understanding is not required. Only obedience, понимаешь, что к чему.
ЗЫ так лень писать пример, а придётся ведь...
-
> Вызов функции FindWindow предполагает то, что хендл окна
> неизвестен, а известен его текст. WM_GETTEXT - наоборот.
> Где тут "облегчение жизни"??
подозрение, что FindWindow это совокупление EnumWindows, WM_GETTEXT и GetClassName
-
Удалено модератором
-
>[24] clickmaker © (2008-02-08 19:53:00)
примерно так оно и есть. именно потому, например, РИхтер не рекомендует для определения наличия уже запущеного экземпляра софтины использовать FindWindow() — она уходит в задумчивость, если какое-то приложение упорно не отвечает. может, в XP и починили (не уверен), а раньше — так. отсюда и «магия» в WM_GETTEXT. но наш энергичный оппонент книжек не читает, поэтому ему оно в офигенную новинку.
---
Understanding is not required. Only obedience.
-
А можно, используя SendMessage и WM_GETTEXT для ТриВьюва узнать текст выделенного узла?
-
Удалено модератором
-
>Master_Of_Puppets (08.02.08 21:01) [27]
Низя
-
-
>[30] Master_Of_Puppets (2008-02-09 01:17:00)
ты хоть понял, что там происходит, или просто кастанул заклинание из гримуара?
---
Understanding is not required. Only obedience.
-
Понял, понял...Не всё, правда, но в том аспекте кода (который мне под себя надо было переделать) разобрался.
-
>[32] Master_Of_Puppets (2008-02-09 12:26:00)
>Понял, понял…
будем надеяться. заодно и в остальном разберись, оно полезно. нет ничего хуже, чем оперировать заклинаниями, а составлять их не уметь. мы тебя всю ветку на «разберись» наталкиваем.
---
Understanding is not required. Only obedience.
-
Угу, спасибо всем за помощь и советы!