powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / TreeView NM_DBLCLK
24 сообщений из 24, страница 1 из 1
TreeView NM_DBLCLK
    #39369169
lnix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго времени суток!
Столкнулся с проблемой программного нажатия node элемента TreeView в другом приложении.
Может кто подсказать где ошибка?

Код: plaintext
1.
2.
3.
4.
5.
6.
NMHDR nmh;
nmh.code = NM_DBLCLK;
nmh.idFrom = (UINT_PTR)hItem; //  hItem (тип переменной  HTREEITEM) элемент TreeView который нужно программно нажать
nmh.hwndFrom = hwnd_stv; // хэндлер элемента SysTreeView

::SendMessageW(::GetParent(hwnd_stv), WM_NOTIFY, nmh.idFrom, (LPARAM)&nmh);



и ничего не работает

Заранее благодарен
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369179
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lnix,

подозреваю, что память под NMHDR нужно выделять в другом приложении(VirtualAllocEx, WriteProcessMemory)
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369186
lnix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,
Я выделял память когда читал этот treeview и искал хэндлов нода treeview. А тут мне нужно просто вызвать функцию связанную с данным нодом. Разве для этого нужно выделять память? И как тогда будет запускаться обработчик. (Пишу со смартфона. Возможны опечатки)
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369196
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lnixЯ выделял память когда читал этот treeview и искал хэндлов нода treeview.
это же память в твоём приложении, а не в том, где treeview живёт
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369228
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lnixВсем доброго времени суток!
Столкнулся с проблемой программного нажатия node элемента TreeView в другом приложении.
Может кто подсказать где ошибка?

Код: plaintext
1.
2.
3.
4.
5.
6.
NMHDR nmh;
nmh.code = NM_DBLCLK;
nmh.idFrom = (UINT_PTR)hItem; //  hItem (тип переменной  HTREEITEM) элемент TreeView который нужно программно нажать
nmh.hwndFrom = hwnd_stv; // хэндлер элемента SysTreeView

::SendMessageW(::GetParent(hwnd_stv), WM_NOTIFY, nmh.idFrom, (LPARAM)&nmh);



и ничего не работает

Заранее благодарен

Так не будет работать, ты вообще не можешь послать это сообщение другому приложению.
Оно содержит адрес структуры NMHDR в посылающем приложении, к памяти которого у принимающего приложения нет
доступа.

К тому же, код вообще неправильный -- NMHDR -- это только общая часть всех структур нотификаций контролов COMMCLL32, а посылать ты должен не её, а её "наследников" -- это описано в описании конкретного нотификационного сообщения , NM_DBLCLK в данном случае.

Плюс к этому -- структура неверно заполнена. Не заполнен в частности размер структуры в заголовке.

В общем, всё не так, и у тебя это вряд ли получится вообще.
Тебе надо изучить примеры приложений из MSDN, работающие с конкретным контролом из COMMCLL32, и сначала добиться работы с контролом, локальным в данном приложении. Затем исследовать уже посылку удалённому приложению.
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369230
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилlnixЯ выделял память когда читал этот treeview и искал хэндлов нода treeview.
это же память в твоём приложении, а не в том, где treeview живёт

Windows по идее может это просекать и копировать временно данные в память другого приложения.
Потоки он же синхронизирует при посылке сообщений, почему бы и это не сделать ?

Делается или нет, я не помню. Надо исследовать MSDN или Рихтера.
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369255
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivWindows по идее может это просекать и копировать временно данные в память другого приложения.
но далеко не для всех сообщений.
WM_COPYDATA - да. а вот разбираться в деталях тривью - это слишком.
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369311
lnix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точно знаю что можно посылать, те кто это умеют делать не желают делиться даже примером
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369327
lnix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может кто подсказать как правильно делать?
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369368
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lnixМожет кто подсказать как правильно делать?
MSDN.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369370
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтоб меня опять не обвиняли в нелояльности к новичкам, процитирую:
MSDNFor Windows 2000 and later systems, the WM_NOTIFY message cannot be sent
between processes.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369371
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369373
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЧтоб меня опять не обвиняли в нелояльности к новичкам, процитирую:
MSDNFor Windows 2000 and later systems, the WM_NOTIFY message cannot be sent
between processes.

ну значит можно внедрить в чужой процесс dll и управлять контролом из родного процесса
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369405
lnix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поиск нужного нода у меня реализован. Тоже самое только на с++. Работает, а вот как программно нажать выбранный нод не знаю. Изначально думал все просто.
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369429
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lnix,

Я же говорю, у тебя так не получится.
Тебе надо СНАЧАЛА научиться хотя бы управлять TreeView в своём процессе, только после этого лезть в чужой.

Если даже ты как-то передашь это сообщение или внедришь .dll (что очень непросто), то у тебя всё равно ничего не будет работать,
потому что код у тебя тупо неверный. А верный сделать для TreeView достаточно сложно, ну, в смысле, там заморочно и надо аккуратно всё делать.

к тому же я подскажу другой путь -- не обязательно посылать WM_NOTIFY, можешь попробовать управлять TreeView, посылая ему
сообщения мыши или клавиатуры. Ключевая особенность их в том, что сообщения эти должны содержать все данные в своих
параметрах, LPARAM, WPARAM, и не содержать там ссылки на структуры в памяти, такие сообщения легко передаются другому процессу.
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369437
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lnixПоиск нужного нода у меня реализован. Тоже самое только на с++. Работает, а вот как программно нажать выбранный нод не знаю. Изначально думал все просто.

Что значит "нажать" ?

выделить -- WM_SELECTITEM

https://msdn.microsoft.com/ru-ru/library/windows/desktop/bb773736(v=vs.85).aspx
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369486
lnix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выбор нода тоже реализован. А вот за идею посылать сообщения мыши пасиб. Попробую.
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369494
lnix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут походил попил чаю, подумал, а ведь разве уведомление WM_NOTUFY в паре с NM_DBLCLK не является эмуляцией двойного нажатия левой кнопки мыши?
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369542
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lnix,

хорошо, что ты подумал, но нет, не является.
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39369763
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lnix,
для начала: странно, что удалённое приложение не крешанулось. Ты передаёшь в SendMessage адрес из своего адресного пространства, соответственно то приложение будет обращаться по этому адресу в своём адресном пространстве и с вероятностью 100% упадёт. Тебя спасло только то, что WM_NOTIFY не кросс-процессное.

потом: WM_NOTIFY - это уже реакция контрола в сторону родителя на какое-то событие (в данном случае)

Идея послать вручную клик, в принципе, неплохая, но сама надобность так делать, уже настораживает. Что за задача вообще стоит изначально, что надо такое делать? Скорее всего ответ на этот вопрос решит все проблемы :)

Чтобы отправить клик, нужно знать положение итема, для этого есть TVM_GETITEMRECT, и для четвёртого параметра нужно выделять память внутри чужого процесса, иначе тут точно навернётся.

Сам клик шлётся функцией SendInput
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39370099
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbдля четвёртого параметра нужно выделять память внутри чужого процесса, иначе тут точно
навернётся.

Не точно. Windows изначально писали не дураки, параметры системных сообщений они
сериализуют и передают между адресными пространствами процессов нормально. При
использовании WM_SETTEXT же ты не лезешь в память чужого процесса...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39370675
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, WM_SETTEXT - особенное, а для большинства сообщений точно навернётся
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39370739
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

для большинства как раз не навернётся
...
Рейтинг: 0 / 0
TreeView NM_DBLCLK
    #39371510
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилдля большинства как раз не навернётсянапример? я навскидку только 2 могу сказать, wm_settext и wm_copydata. Все сообщения для получения инфы в контролах через структуры - навернутся. Приведите пример сообщения с передачей адреса какой-либо структуры, который не приводит к падению процесса.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / TreeView NM_DBLCLK
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]