Как настроить механизм обратного вызова для RichEdit в win32 - PullRequest
0 голосов
/ 22 декабря 2008

В win32 как настроить механизм обратного вызова для RichEdit, который я не создал сам?

ЧАСТЬ 1

Я читаю из поля textedit в графическом интерфейсе другого приложения . Теперь это прекрасно работает, за исключением того, что после первого чтения я хочу получать только новые или измененные строки. В GTK + или Qt я бы просто установил обратный вызов для некоторого сигнала, который поле редактирует, когда оно изменилось, но как это работает на Win32?

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

ЧАСТЬ 2

Кроме того, , если нет такого «измененного текста», это обратный вызов вновь вставленного текста, который немедленно возвращает новое содержимое, мне нужен какой-то способ, чтобы легко определить, что нового. С макушки головы:

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

Вариант 2 может быть нежизнеспособным, так как textedit может содержать любое количество текста. Часть маркера звучит выполнимо, но опять же, мои слабые навыки Win32 и ужасные названия функций Win32 мешают мне найти правильный способ сделать это.

Обратите внимание, что все это должно быть выполнимо для textedit, который я не владею и не создал, он принадлежит стороннему процессу.

Примеры кода в C ++ высоко ценятся.

Отказ

Очевидно, если есть какой-то лучший способ сделать это, дайте мне знать. Я только предполагал, что обратный вызов будет способом, основанным на моем предыдущем опыте с GTK + / Qt. Не стесняйтесь, чтобы показать мне путь:)

Ответы [ 3 ]

1 голос
/ 20 апреля 2011

Я понимаю, что это старый пост, но эта статья, похоже, делает нечто подобное.

1 голос
/ 22 декабря 2008

Элементы управления Win32 не работают для специфичных для сообщений обратных вызовов, на которые вы можете подписаться. Они просто отправляют сообщения в родительское окно, когда что-то происходит, в этом случае EN_UPDATE, EN_CHANGE и все такое. Даже эти события не говорят вам, какой текст изменился. Они только говорят, что изменилось .

Вы можете создать подкласс родительского объекта, но в документации для SetWindowLongPtr прямо сказано, что вы "не должны создавать подкласс класса окна, созданного другим процессом". Нечто подобное возможно и с крючками, но я недостаточно использовал их, чтобы точно сказать, как вы на самом деле это сделаете.

0 голосов
/ 24 декабря 2008

Основываясь на ответе Джоэла, я перестал искать обратные вызовы и просто создал небольшой класс, который привязывает себя (но не с помощью реального API-интерфейса) к richedit и опрашивает его раз в секунду на предмет длины контента, и если он изменился с последний опрос запрашивает контент, сравнивает его с предыдущим известным контентом и выдает сигнал с измененным контентом.

Похоже, что для этой цели все в порядке, но если кто-то знает лучший способ (какой-то реальный и проверенный способ сделать это с помощью хуков API или чего-то еще), пожалуйста, напишите.

...