如何在win32中为RichEdit设置回调机制

时间:2008-12-22 06:19:58

标签: c++ winapi ipc callback richedit

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

第1部分

I'm reading from a textedit field in another application's GUI。现在这个工作正常,除了第一次读取后我只想获取新的或修改过的行。在GTK +或Qt中,我只是在一些信号上安装一个回调函数,当它改变了字段时编辑,但它如何在Win32上工作?

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

第2部分

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

  1. 在我们阅读过的文本块的末尾有一个标记,只能在该文本块和结尾之间读取。
  2. 存储我们之前阅读过的内容,在第二次阅读后,从后者中删除重复的部分以获得新插入的内容。
  3. 选项2可能不可行,因为textedit可以包含任意数量的文本。标记部分听起来很可行,但是再一次,我虚弱的Win32技能和可怕的Win32函数名称阻止我找到正确的方法。

    请注意,对于我拥有且尚未创建的textedit,所有这些都必须是可行的,它们属于第三方流程。

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

    声明

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

3 个答案:

答案 0 :(得分:1)

Win32控件不适用于您可以订阅的特定于消息的回调。当发生某些事情时,他们只是将消息发送到他们的父窗口,在这种情况下EN_UPDATE,EN_CHANGE以及所有这些。即使这些事件也没有告诉你哪些文字发生了变化。他们只告诉你它做了更改。

您可以对父类进行子类化,但SetWindowLongPtr的文档明确表示您“不应该为另一个进程创建的窗口类创建子类”。像这样的东西可能是钩子,但我没有用它们来确定你是如何实际做到的。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

根据Joel的回答,我退出寻找回调并且只创建了一个小类,它将自身(不是通过真正的API钩子)挂钩到richedit并且每秒轮询一次内容长度,如果它已经改变了在最后一次轮询中,它要求内容,将其与先前已知内容进行比较,并发出包含更改内容的信号。

这似乎可以用于此目的,但如果有人知道一个更好的方法(通过API钩子或其他东西做一些真实和经过测试的方式),请发帖。