0

在win32中,我如何为我自己没有创建的RichEdit设置回调机制?

第1部分

我正在阅读另一个应用程序 GUI 中的 textedit 字段。这现在工作得很好,除了第一次阅读后我只想获取新的或修改的行。在 GTK+ 或 Qt 中,我只需在字段更改时编辑的某些信号上安装回调,但它在 Win32 上如何工作?

我的 MSDN 搜索结果没有任何用处,可能是因为我不知道要搜索的确切术语。textedit 的类是RichText20W,它有一些可能以某种方式使用的消息,尽管那篇文章只是讨论了将它们用于类的父级。

第2部分

另外,如果没有这样的“文本更改,这里是新插入的文本”回调立即返回新内容,我需要一些方法来轻松检测新内容。从我的头顶:

  1. 在我们阅读的文本块的末尾有一个标记,并且只在它和结尾之间阅读。
  2. 存储我们之前读过的内容,并在第二次阅读后,从后者中删除重复的部分以获取新插入的内容。

选项 2 可能不可行,因为 textedit 可以包含任意数量的文本。标记部分听起来可行,但再一次,我微弱的 Win32 技能和可怕的 Win32 函数名称使我无法找到正确的方法。

请注意,对于我拥有且未创建的文本编辑器,所有这些都必须是可行的,它们属于第三方进程。

高度赞赏 C++ 中的代码示例。

免责声明

显然,如果有更好的方法,请告诉我。根据我之前使用 GTK+/Qt 的经验,我只假设回调是可行的方法。随意告诉我路径:)

4

3 回答 3

1

Win32 控件不适用于您可以订阅的特定于消息的回调。他们只是在发生某些事情时向其父窗口发送消息,在本例中为 EN_UPDATE、EN_CHANGE 等等。即使是这些事件也不会告诉你什么文本发生了变化。他们只告诉你它确实改变了。

您可以将父级子类化,但 SetWindowLongPtr 的文档明确表示您“不应子类化由另一个进程创建的窗口类”。使用钩子可能会发生这样的事情,但我还没有充分使用它们来确定你实际上是如何做到的。

于 2008-12-22T18:48:51.243 回答
1

我意识到这是一篇旧文章,但这篇文章似乎在做类似的事情。

于 2011-04-19T21:11:15.910 回答
0

根据 Joel 的回答,我不再寻找回调,而是创建了一个小类,将自身(不是通过真正的 API 挂钩)连接到 Richedit 并每秒轮询一次内容长度,以及自上次轮询以来它是否已更改,它会询问内容,将其与先前已知的内容进行比较,并使用更改的内容发出信号。

为此目的,这似乎可以正常工作,但是如果有人仍然知道更好的方法(通过 API 挂钩或其他方式进行的一些真实且经过测试的方法),请发布。

于 2008-12-24T09:25:13.640 回答