![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Добавить текст в чужой RichEdit 2.0 [D7, WinXP]
3k © (2005-04-17 13:58:00)Здравствуйте, уважаемые мастера.
Есть такая проблема, речь пойдет о RichEdit 2.0 . Нашел я окно, его Handle, имя класса (RichEdit20W). Как записать в RichEdit чужого приложения текст. Не прокатывает почему-то WM_SETTEXT.
3k (2005-04-22 18:29:00) [1]ANB & Roadstar, огромное спасибо за помощь. Ошибку нашел, и как всегда она была просто идиотской.
С уважением, 3k.
ANB (2005-04-22 09:16:00) [2]Я в WordPad посылал. Версия 5.1 от XP.
3k (2005-04-22 02:38:00) [3]В отъезде был, так что хочу вернуться к теме.
To: ANB © (19.04.05 09:26) [6]
1. А hREdit RichEdit'a, это был handle в другом приложении, т.е Вы посылали текст не в RichEdit собственного приложения?
2. Это был именно RichEdit 2.0?
3k (2005-04-22 02:38:00) [4]В отъезде был, так что хочу вернуться к теме.
To: ANB © (19.04.05 09:26) [6]
1. А hREdit RichEdit'a, это был handle в другом приложении, т.е Вы посылали текст не в RichEdit собственного приложения?
2. Это был именно RichEdit 2.0?
ANB (2005-04-19 09:26:00) [5]Я у себя проверил. Текст присваивается. Тебе нужно именно добавить или заменить ?
Если заменить - это всего 2 команды :
SendMessage(hControl, EM_SETSEL, 0, -1); // Выделить все
SendMessage(hControl, EM_REPLACESEL, 0, LongWord(PChar(sText))); // Заменить выделение
Если добавить - нужно загнать выделение в конец.
3k (2005-04-18 14:31:00) [6]> ANB "или попробовать юзать EM_SETSEL + EM_REPLACESEL"
Пробывал, не работает. Может я ошибся где (см. ниже)? И насчет эмуляции нажатий клавиш, тоже думал, слишком медленно работает.
procedure Insert(hREdit:THandle; Index:Integer; const S:string);
var
L: Integer;
Selection: TCharRange;
Fmt: PChar;
Str: string;
begin
if Index >= 0 then
begin
Selection.cpMin := SendMessage(hREdit, EM_LINEINDEX, Index, 0);
if Selection.cpMin >= 0 then Fmt := '%s'#13#10
else begin
Selection.cpMin :=SendMessage(hREdit, EM_LINEINDEX, Index - 1, 0);
if Selection.cpMin < 0 then Exit;
L := SendMessage(hREdit, EM_LINELENGTH, Selection.cpMin, 0);
if L = 0 then Exit;
Inc(Selection.cpMin, L);
Fmt := #13#10'%s';
end;
Selection.cpMax := Selection.cpMin;
SendMessage(hREdit, EM_EXSETSEL, 0, Longint(@Selection));
Str := Format(Fmt, [S]);
SendMessage(hREdit, EM_REPLACESEL, 0, LongInt(PChar(Str)));
end;
end;
ANB (2005-04-18 11:22:00) [7]
> Roadstar (18.04.05 10:13) [1]
- не прав.
> 3k (17.04.05 13:58)
про WM_SETTEXT я уже сюда писал, к тексту эдитов это сообщение никакого отношения не имеет. 2 пути - эмулировать нажатие клавиш (не очень просто и проблемы с русскими буквами) или попробовать юзать EM_SETSEL + EM_REPLACESEL. Для эдитов и мемок проверял - работает. Для RichEdit попробуй сам.
ЗЫ.Иногда WM_GETTEXT/WM_SETTEXT для некоторых эдитов работает правильно, но я редко на такие нарывался.
ANB (2005-04-18 11:21:00) [8]
> Roadstar (18.04.05 10:13) [1]
- не прав.
> 3k (17.04.05 13:58)
про WM_SETTEXT я уже сюда писал, к тексту эдитов это сообщение никакого отношения не имеет. 2 пути - эмулировать нажатие клавиш (не очень просто и проблемы с русскими буквами) или попробовать юзать EM_SETSEL + EM_REPLACESEL. Для эдитов и мемок проверял - работает. Для RichEdit попробуй сам.
ЗЫ.Иногда WM_GETTEXT/WM_SETTEXT для некоторых эдитов работает правильно, но я редко на такие нарывался.
ANB (2005-04-18 11:21:00) [9]
> Roadstar (18.04.05 10:13) [1]
- не прав.
> 3k (17.04.05 13:58)
про WM_SETTEXT я уже сюда писал, к тексту эдитов это сообщение никакого отношения не имеет. 2 пути - эмулировать нажатие клавиш (не очень просто и проблемы с русскими буквами) или попробовать юзать EM_SETSEL + EM_REPLACESEL. Для эдитов и мемок проверял - работает. Для RichEdit попробуй сам.
ЗЫ.Иногда WM_GETTEXT/WM_SETTEXT для некоторых эдитов работает правильно, но я редко на такие нарывался.
Roadstar (2005-04-18 10:13:00) [10]И не прокатит, потому, что это чужой процесс.
Ищи тут: CreateRemoteThread, Write/Read ProcessMemory и т.д.