Сейчас на форуме: tyns777, zombi-vadim (+4 невидимых)

 eXeL@B —› Программирование —› RichEdit в чужой проге
Посл.ответ Сообщение

Ранг: 34.6 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 07 ноября 2007 14:39 · Поправил: Alexus2006
· Личное сообщение · #1

Class NotesRichText!!! может ли такое быть что объект данного класса не реагирует на оконные сообщения? Если так тогда как с него вытащить текст? только процесс вскрывать(OpenProcess) что ли и шариться в памяти(ReadProcessMemory) может есть другие варианты?



Ранг: 1.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 ноября 2007 19:37
· Личное сообщение · #2

если это наследник от виндового RichEdit (а не какой то самописный с похожи названием), то он должен реагировать на EM_GETTEXTEX. Но ты должен инжектиться, так как EM_GETTEXTEX, в отличии от WM_GETTEXT работает только в пределах процесса.




Ранг: 756.3 (! !), 113thx
Активность: 0.610.05
Статус: Участник
Student

Создано: 08 ноября 2007 01:53
· Личное сообщение · #3

юзаем поиск прежде чем тему создавать... Уже было --> тут <--

-----
z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh




Ранг: 34.6 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 08 ноября 2007 08:43
· Личное сообщение · #4

Хорошо... а есть ли способ узнать на какие оконные сообщения реагирует этот компонент? поиск не принёс результатов... документации тоже на него нет ни какой...



Ранг: 35.1 (посетитель), 1thx
Активность: 0.010
Статус: Участник

Создано: 08 ноября 2007 09:28
· Личное сообщение · #5

Alexus2006 пишет:
а есть ли способ узнать на какие оконные сообщения реагирует этот компонент?

Ну так возьми Spy++ и посмотри что вообще этому контролу отправляется или из под Olly
View->Windows->Message breakpoint on WinProc



Ранг: 34.6 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 08 ноября 2007 16:51
· Личное сообщение · #6

HANDLE MainWindowHandle, RichEditWHandle, ProcessHandle;
DWORD dwProcessId, ProcessID ;
//Cardinal ProcessID ;
GETTEXTLENGTHEX StructTextLength;
GETTEXTEX StructTextEx;
Pointer PStructTextLength, PStructTextEx, PTextBuffer;
DWORD BytesWriten, RichEditTextLength;
char TextBuffer;

// Хандлы верные ws32.exe подсмотрел...
MainWindowHandle = (void *)0x00040198;
RichEditWHandle = (void *)0x0005047C;

GetWindowThreadProcessId(MainWindowHandle, &ProcessID);

// Открываем процесс
ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, True, ProcessID);
PStructTextLength = VirtualAllocEx(ProcessHandle,
NULL, sizeof(GETTEXTLENGTHEX),
MEM_COMMIT | MEM_TOP_DOWN,
PAGE_READWRITE);

// Подготавливаем структуру...
StructTextLength.flags = GTL_NUMBYTES | GTL_USECRLF;
StructTextLength.codepage = 1200;

// ...и пишем ее в память процесса
WriteProcessMemory(ProcessHandle, PStructTextLength, &StructTextLength, sizeof(GETTEXTLENGTHEX), &BytesWriten);
if (BytesWriten != sizeof(GETTEXTLENGTHEX)) RaiseLastOSError();

// Отправляем сообщение удаленному RichEdit,
// чтобы узнать необходимый размер буффера
RichEditTextLength = SendMessage(RichEditWHandle, EM_GETTEXTLENGTHEX, (WPARAM)PStructTextLength, (LPARAM)0);

//RichEditTextLength - равно 0 ... где ошибка?



Ранг: 29.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 08 ноября 2007 20:40
· Личное сообщение · #7

проверяй RichEditTextLength на неравенство с E_INVALIDARG , после СендаМессаги.



Ранг: 34.6 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 09 ноября 2007 08:39
· Личное сообщение · #8

RichEditTextLength != E_INVALIDARG
а что толку то? ...
RichEditTextLength = SendMessage(RichEditWHandle, EM_GETTEXTLENGTHEX, (WPARAM)PStructTextLength, (LPARAM)0);
Вот тут SendMessage должен ли вернуть длинну текста? или куда должна вернуться длина?



Ранг: 29.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 09 ноября 2007 08:53 · Поправил: Grom_
· Личное сообщение · #9

по идее если результат не равен E_INVALIDARG , то результат является длинной.

А ты правельно ХЕНДЛ вводишь ? , может попробывать этот Рич-едит отловить через FindWindow с помощью имени класса (вроде так можно было).



Ранг: 35.1 (посетитель), 1thx
Активность: 0.010
Статус: Участник

Создано: 09 ноября 2007 08:57
· Личное сообщение · #10

Для получения длины текста и самого текста из RichEdit-а внедрятся в удаленное адресное пространство не нужно. Достаточно обычных вызовов по аналогии с EDIT. (Внедрение нужно если есть желание воспользоваться расширенными возможностями данного класса, к пример выделить часть текста другим цветом).
Отправь контролу обычный WM_GETTEXT. Если не вернет данных - значит кастом...



Ранг: 34.6 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 09 ноября 2007 09:42
· Личное сообщение · #11

Дело в том что компонент не просто RichEdit, a NotesRichText ... точно даже не известно дочерний ли это класс от простого RichEdit...
посылка WM_GETTEXT результатов тоже не даёт... Хендлы точно верные... я их в проге функцией WindowFromPoint(CrPos) нахожу... для точности ws32.exe проверял... там же смотрел окно нормально получает сообщения, только в ответ нечего не получаю...



Ранг: 34.6 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 09 ноября 2007 09:43
· Личное сообщение · #12





Ранг: 34.6 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 12 ноября 2007 09:44
· Личное сообщение · #13

а как получить текст от CustomEdit ?



Ранг: 34.6 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 13 ноября 2007 09:53
· Личное сообщение · #14

Что за сообщения WM_USER+0x4 и WM_USER+0x7 ?



Ранг: 35.1 (посетитель), 1thx
Активность: 0.010
Статус: Участник

Создано: 13 ноября 2007 11:07
· Личное сообщение · #15

Обычные пользовательские сообщения. На них можно прикрутить любую логику. Вообще из кастома здается мне, без желания разработчика ты не сможешь ничего вытащить обычными оконными сообщениями.



Ранг: 29.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 13 ноября 2007 14:01 · Поправил: Grom_
· Личное сообщение · #16

Alexus2006 пишет:
Что за сообщения WM_USER+0x4 и WM_USER+0x7 ?

это собственные сообщения, возможно на них есть нужная функциональность....
К ней прибегают когда нужно что то сделать через МЕссаги, но не стандартное. Как правело такие месаги сами посылают и сами обрабатывают, они не стандартны мало кто их поймет

вообще по идее , если КустомЕдит поддерживает выделение и копирование, можно месагами выдернуть текст. Если нет то нуно смотреть организацию Кустом Едита и отлавливать строчку(и) в памяти. Хотя это только предположение...



Ранг: 34.6 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 15 ноября 2007 14:21 · Поправил: Alexus2006
· Личное сообщение · #17

Какие ещё есть варианты содрать текст с чужого контрола если текст заранее не известен т.е. поиск в памяти процесса не вариант, и контрол не отдаёт текст по сообщениям WM_GETTEXT EM_GETTEXTEX функция GetWindowText результатов также не даёт... неужели всё пропало?




Ранг: 81.7 (постоянный), 10thx
Активность: 0.030
Статус: Участник

Создано: 15 ноября 2007 19:44
· Личное сообщение · #18

делай фокус на контрл и посылай комбинацию клавиш CTRA+A и CTRL+C, далее работай с буфером.

В своем посте я другого варианта не нашел


 eXeL@B —› Программирование —› RichEdit в чужой проге
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати