【发布时间】:2014-02-22 23:03:33
【问题描述】:
我正在尝试从另一个程序中获取 Richedit 控件的文本。
所以我为 SendMessage 找到了 EM_STREAMOUT。
这是我目前的代码(也来自另一个 Stackoverflow 主题):
DWORD CALLBACK EditStreamOutCallback(DWORD_PTR dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
std::stringstream *rtf = (std::stringstream*) dwCookie;
rtf->write((char*)pbBuff, cb);
*pcb = cb;
return 0;
}
int main() {
std::stringstream rtf;
EDITSTREAM es = {0};
es.dwCookie = (DWORD_PTR) &rtf;
es.pfnCallback = &EditStreamOutCallback;
SendMessage((HWND) 0x00000000000A06E8, EM_STREAMOUT, SF_RTF, (LPARAM)&es);
}
唯一发生的事情是 SendMessage 返回 0 - 所以显然没有读取任何字节 - 我试图从中获取信息的程序的 CPU 使用率达到 100%。
【问题讨论】:
-
EM_STREAMOUT 无法跨越进程边界。您需要将代码注入其他进程才能使其正常工作。
-
但是使用 WM_GETTEXT 从普通编辑控件中读取文本工作正常,我在 MSDN 中没有找到任何说明它不能跨进程边界工作的内容。
-
您在 SO 评论中找到了它。没错。
-
假设它是正确的 - 我如何从另一个程序的 Richedit 中获取文本?这一定是可能的,因为我能够在围绕 WinAPI 的 AutoIt 中做到这一点。
-
WM_GETTEXT 可以,但是如果你想要格式化文本,你必须注入你的代码。
标签: c++ c winapi sendmessage richedit