Управление чужим приложением
От: L0N6 Россия  
Дата: 27.08.05 10:47
Оценка:
Есть чужое приложение.
Нахожу его хэндл через FindWindow. У этого приложения нахожу хэндл объекта (TreeView).
Собственно, вопрос:
Как получить текст каждого элемента TreeView, и установить на нем фокус?
Re: Управление чужим приложением
От: crackoff Россия  
Дата: 27.08.05 11:23
Оценка: 2 (1)
Здравствуйте, L0N6, Вы писали:

LN>Есть чужое приложение.

LN>Нахожу его хэндл через FindWindow. У этого приложения нахожу хэндл объекта (TreeView).
LN>Собственно, вопрос:
LN>Как получить текст каждого элемента TreeView, и установить на нем фокус?

Сообщения дереву TVM_, в частности TVM_GETNEXTITEM и функция SetFocus должны помочь
Re[2]: Управление чужим приложением
От: L0N6 Россия  
Дата: 27.08.05 14:58
Оценка:
Здравствуйте, crackoff, Вы писали:

C>Сообщения дереву TVM_, в частности TVM_GETNEXTITEM и функция SetFocus должны помочь


Спасибо, это уже ближе к делу, но что я не так деляю:
HWND hWnd, hTree, hItem;
TV_ITEM Item;
char Text[256] = {0};
hWnd = FindWindow( NULL, "TestForm" );
hTree = GetWindow( hWnd, GW_CHILD );
Item.mask = TVIF_TEXT | TVIF_HANDLE;
Item.pszText = Text;
Item.cchTextMax = 256;
Item.hItem = (HTREEITEM) SendMessage( hTree, TVM_GETNEXTITEM, TVGN_CARET, 0);
SendMessage( hTree, TVM_GETITEM, 0, (LPARAM)&Item );

После выполения в Item.pszText содержится пустой текст.
Re[3]: Управление чужим приложением
От: Nazik Россия  
Дата: 27.08.05 20:04
Оценка:
Я не являюсь богом API, но что-то мне подсказывает, что в контексте другого приложения хэндлы на память нашего приложения недействительны... Надо пользовать VirtualAlloc, чтобы выделить память в другом приложении!!!

Здравствуйте, L0N6, Вы писали:

LN>Здравствуйте, crackoff, Вы писали:


C>>Сообщения дереву TVM_, в частности TVM_GETNEXTITEM и функция SetFocus должны помочь


LN>Спасибо, это уже ближе к делу, но что я не так деляю:

LN>
LN>HWND hWnd, hTree, hItem;
LN>TV_ITEM Item;
LN>char Text[256] = {0};
LN>hWnd = FindWindow( NULL, "TestForm" );
LN>hTree = GetWindow( hWnd, GW_CHILD );
LN>Item.mask = TVIF_TEXT | TVIF_HANDLE;
LN>Item.pszText = Text;
LN>Item.cchTextMax = 256;
LN>Item.hItem = (HTREEITEM) SendMessage( hTree, TVM_GETNEXTITEM, TVGN_CARET, 0);
LN>SendMessage( hTree, TVM_GETITEM, 0, (LPARAM)&Item );
LN>

LN>После выполения в Item.pszText содержится пустой текст.
Re[4]: Управление чужим приложением
От: Stanky  
Дата: 29.08.05 21:58
Оценка:
> Надо пользовать VirtualAlloc, чтобы выделить память в другом приложении!!!
>
Нет, нужно внедрить в чужое приложение свою DLL'ку (так как у каждого процесса своё адресное пространство), которая уже будет общаться с приложением!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[5]: Управление чужим приложением
От: L0N6 Россия  
Дата: 30.08.05 11:23
Оценка:
Здравствуйте, Stanky, Вы писали:

S>Нет, нужно внедрить в чужое приложение свою DLL'ку (так как у каждого процесса своё адресное пространство), которая уже будет общаться с приложением!!!


Ужас какой-то...
Хоть примерно, как это делается?
Re[6]: Управление чужим приложением
От: Stanky  
Дата: 30.08.05 11:45
Оценка:
> Ужас какой-то...
>
На самом деле всё довольно просто!!!

> Хоть примерно, как это делается?

>
Что это?
Про внедрение своей DLL'ки в чужой процесс читать Рихтера!!! Если есть более конкретные вопросы, спрашивай!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[7]: Управление чужим приложением
От: Ury  
Дата: 06.09.05 13:34
Оценка:
Ну, насчет внедрения dll это перебор.
Но повозиться придется.
Все передаваемые с сообщением структуры нужно выделить во вражеском процессе с помощью функций VirtualAllocEx, заполнить с помощью функций WriteProcessMemory, не забыть корректно расставить указатели. Результаты забирать с помощью ReadProcessMemory и не забывать про VirtualFreeEx. Стремно, конечно, первый раз, но при должной сноровке получается довольно просто.
Да, вражеский процесс нужно открывать с параметрами PROCESS_VM_WRITE|PROCESS_VM_READ|PROCESS_VM_OPERATION.
Re[8]: Управление чужим приложением
От: srggal Украина  
Дата: 06.09.05 13:55
Оценка:
Здравствуйте, Ury, Вы писали:

Ury>Ну, насчет внедрения dll это перебор.

Ury>Но повозиться придется.
Ury>Все передаваемые с сообщением структуры нужно выделить во вражеском процессе с помощью функций VirtualAllocEx, заполнить с помощью функций WriteProcessMemory, не забыть корректно расставить указатели. Результаты забирать с помощью ReadProcessMemory и не забывать про VirtualFreeEx. Стремно, конечно, первый раз, но при должной сноровке получается довольно просто.
Ury>Да, вражеский процесс нужно открывать с параметрами PROCESS_VM_WRITE|PROCESS_VM_READ|PROCESS_VM_OPERATION.

ИМХО: больше проблем будет при выделении всех нужных структур...
Внедрение ДЛЛ — проще, поскоку сам "рабочий" код (код в длл) — будет прозрачным.

Немного переделать ивсе
Автор(ы): Сергей Холодилов
Дата: 13.02.2005
В статье описывается один из методов внедрения DLL. Разбираются способы взаимодействия с внедренной библиотекой.
... << RSDN@Home 1.1.4 stable rev. 510>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.