SysTreeView32 message-s

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Код: Выделить всё

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);
>На самом деле я вижу, что некоторые поля структуры тулза всё-таки извлекла и показала:
Это не моя тузла к сожалению :)
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Duncon, ты видишь разницу между хэндлом HTREEITEM и структурой TV_ITEM? Если нет, то внимательней прочти кусочек кода, который я привёл в предыдущем посте.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Немного туплю после праздника, ты имеешь ввиду что-то типа этого

Код: Выделить всё

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..
зы Блин придумал себе задачку :D
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Код: Выделить всё

SendMessage(_handle, TVM_SETITEMW, 0, Itemh2);
Duncon, при отсылке сообщения TVM_SETITEM в качестве lParam передаётся поинтер на структуру, а не хэндл айтема. Хэндл айтэма является полем этой структуры.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

В этом то и прикол при 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));
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

В этом то и прикол при 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));
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Duncon, дорогой, у тебя hItem какого типа? HTREEITEM. А у меня в коде какого типа? TV_ITEM. Чувствуешь разницу? Подправь ZeroMemory. Естественно летит виолэйшн. Хэндл ведь, размером 4 байта, а структура, ну байт 20 на вскидку, может и больше. Всё остальное похоже на правду.

Видно ты Новый год хорошо отметил :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

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() :/
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Ромео :) Впрочем, повторение в данном случае явно не повредит:
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.
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Че-то ничего не выхоит, ну да пес с ним праздник сей час продолжится, продолжу лагать и тупить завтра :D

Код: Выделить всё

  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));
Ответить