Страница 2 из 3
Re: SysTreeView32 message-s
Добавлено: 02 янв 2008, 11:56
Duncon
Код: Выделить всё
ZeroMemory(@Itemh2, sizeof(TV_ITEM)); - получил в итоге отказ в доступе
ZeroMemory(@Itemh2, sizeof(Itemh2)); - ничего не произошло
SendMessage(_handle, TVM_SETITEMW, 0, Itemh2);
А вот собствено как я получаю Итем
Код: Выделить всё
var
Itemh1, Itemh2: Thandle;
begin
...
Itemh1 := SendMessage(_handle, TVM_GETNEXTITEM, TVGN_ROOT, 0);
Itemh2 := SendMessage(_handle, TVM_GETNEXTITEM, TVGN_NEXT, Itemh1);
>На самом деле я вижу, что некоторые поля структуры тулза всё-таки извлекла и показала:
Это не моя тузла к сожалению

Re: SysTreeView32 message-s
Добавлено: 02 янв 2008, 12:03
Romeo
Duncon, ты видишь разницу между хэндлом HTREEITEM и структурой TV_ITEM? Если нет, то внимательней прочти кусочек кода, который я привёл в предыдущем посте.
Re: SysTreeView32 message-s
Добавлено: 02 янв 2008, 12:41
Duncon
Немного туплю после праздника, ты имеешь ввиду что-то типа этого
Код: Выделить всё
var
Itemh1, Itemh2, Itemh3: Thandle;
ltvItem: TTVItem;
begin
Itemh1 := SendMessage(_handle, TVM_GETNEXTITEM, TVGN_ROOT, 0);
GetTreeNodesText(_handle, HTREEITEM(Itemh1));
Itemh2 := SendMessage(_handle, TVM_GETNEXTITEM, TVGN_NEXT, Itemh1);
GetTreeNodesText(_handle, HTREEITEM(Itemh2));
PostMessage(_handle, TVM_SELECTITEM, TVGN_CARET, Itemh2);
ZeroMemory(HTREEITEM(Itemh2), sizeof(TV_ITEM));
with ltvItem do begin
mask := TVIF_STATE;
stateMask := TVIS_OVERLAYMASK;
iSelectedImage := 2;
hItem := HTREEITEM(Itemh2);
cchTextMax := 2048;
end;
SendMessage(_handle, TVM_SETITEMW, 0, Itemh2);
Но здесь нужно как-то перезаписать тогда этот параметр на тоже место, я не уверен в SendMessage(_handle, TVM_SETITEMW, 0, Itemh2);
По идее нужно заменить на ltvItem, но тут траблы ибо параметром Integer передается..
ps По ходу нужно ударяться в сторону WriteProcessMemory..
зы Блин придумал себе задачку

Re: SysTreeView32 message-s
Добавлено: 02 янв 2008, 13:13
Romeo
Код: Выделить всё
SendMessage(_handle, TVM_SETITEMW, 0, Itemh2);
Duncon, при отсылке сообщения TVM_SETITEM в качестве lParam передаётся поинтер на структуру, а не хэндл айтема. Хэндл айтэма является полем этой структуры.
Re: SysTreeView32 message-s
Добавлено: 02 янв 2008, 14:33
Duncon
В этом то и прикол при ZeroMemory(hItem, sizeof(TV_ITEM)); вылетаем на Access violation
Код: Выделить всё
var
ltvItem: TTVItem;
hItem : HTREEITEM;
begin
Form1.Memo1.Clear;
EnumChildWindows(h, @OOTreeProc, 0);
Application.ProcessMessages;
hItem := HTREEITEM(SendMessage(_handle, TVM_GETNEXTITEM, TVGN_ROOT, 0));
SendMessage(_handle, TVM_SELECTITEM, TVGN_CARET, longint(hItem));
ZeroMemory(hItem, sizeof(TV_ITEM));
with ltvItem do begin
mask := TVIF_STATE;
hItem := hItem;
state := TVIF_STATE;
stateMask := TVIS_OVERLAYMASK;
pszText := '123';
cchTextMax := 2048;
iImage := 1;
iSelectedImage := 1;
cChildren := 0;
lParam := 1;
end;
SendMessage(_handle, TVM_SETITEMW, 0, longint(@ltvItem));
Re: SysTreeView32 message-s
Добавлено: 02 янв 2008, 14:34
Duncon
В этом то и прикол при ZeroMemory(hItem, sizeof(TV_ITEM)); вылетаем на Access violation
Код: Выделить всё
var
ltvItem: TTVItem;
hItem : HTREEITEM;
begin
hItem := HTREEITEM(SendMessage(_handle, TVM_GETNEXTITEM, TVGN_ROOT, 0));
SendMessage(_handle, TVM_SELECTITEM, TVGN_CARET, longint(hItem));
ZeroMemory(hItem, sizeof(TV_ITEM));
with ltvItem do begin
mask := TVIF_STATE;
hItem := hItem;
state := TVIF_STATE;
stateMask := TVIS_OVERLAYMASK;
pszText := '123';
cchTextMax := 2048;
iImage := 1;
iSelectedImage := 1;
cChildren := 0;
lParam := 1;
end;
SendMessage(_handle, TVM_SETITEMW, 0, longint(@ltvItem));
Re: SysTreeView32 message-s
Добавлено: 02 янв 2008, 14:46
Romeo
Duncon, дорогой, у тебя hItem какого типа? HTREEITEM. А у меня в коде какого типа? TV_ITEM. Чувствуешь разницу? Подправь ZeroMemory. Естественно летит виолэйшн. Хэндл ведь, размером 4 байта, а структура, ну байт 20 на вскидку, может и больше. Всё остальное похоже на правду.
Видно ты Новый год хорошо отметил

Re: SysTreeView32 message-s
Добавлено: 02 янв 2008, 14:49
Eugie
Duncon, ты нереально тупишь
HTREEITEM - это хэндл, его размер 4 байта.
TTVItem - структура, размер можешь оценить сам:
Код: Выделить всё
typedef struct tagTVITEM {
UINT mask;
HTREEITEM hItem;
UINT state;
UINT stateMask;
LPTSTR pszText;
int cchTextMax;
int iImage;
int iSelectedImage;
int cChildren;
LPARAM lParam;
} TVITEM, *LPTVITEM;
А теперь подумай, что ты делаешь в ZeroMemory() :/
Re: SysTreeView32 message-s
Добавлено: 02 янв 2008, 15:31
Eugie
Ромео

Впрочем, повторение в данном случае явно не повредит:
http://msdn2.microsoft.com/en-us/librar ... S.85).aspx
http://msdn2.microsoft.com/en-us/librar ... S.85).aspx
Duncon, а в итоге-то чего ты добиваешься? Если хочешь программно изменить состояние элемента TreeView, выбирай айтем (это как я понял у тебя получилось), получай его текущее состояние через TVM_GETITEM, меняй нужные поля, задавай новое состояние через TVM_SETITEM. Примерно так. Только неплохо бы еще знать смысл передаваемых параметров - какая мелочь

Вот здесь, боюсь, кроме Spy тебе никто не поможет. Кстати, в Delphi с незапамятных времен в поставку включен аналогичный инструмент, называется WinSight.
Re: SysTreeView32 message-s
Добавлено: 02 янв 2008, 16:18
Duncon
Че-то ничего не выхоит, ну да пес с ним праздник сей час продолжится, продолжу лагать и тупить завтра
Код: Выделить всё
hItem: HTREEITEM;
Item: TTVItem;
begin
hItem := HTREEITEM(SendMessage(_handle, TVM_GETNEXTITEM, TVGN_ROOT, 0));
SendMessage(_handle, TVM_SELECTITEM, TVGN_CARET, longint(hItem));
ZeroMemory(@Item, sizeof(Item));
with Item do begin
mask := TVIF_STATE;
hItem := hItem;
state := TVIF_STATE;
stateMask := TVIS_OVERLAYMASK;
pszText := '123';
cchTextMax := 2048;
iImage := 1;
iSelectedImage := 1;
cChildren := 0;
lParam := 1;
end;
SendMessage(_handle, TVM_SETITEMW, TVGN_CARET, longint(@Item));