Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ WinAPI EM_STREAMOUT崩溃_C++_C_Winapi_Sendmessage_Richedit - Fatal编程技术网

C++ WinAPI EM_STREAMOUT崩溃

C++ WinAPI EM_STREAMOUT崩溃,c++,c,winapi,sendmessage,richedit,C++,C,Winapi,Sendmessage,Richedit,我正在尝试从另一个程序获取Richedit控件的文本 所以我找到了发送消息的EM_STREAMOUT 这是我到目前为止的代码(也是来自另一个Stackoverflow主题): 唯一发生的事情是SendMessage返回0—显然没有读取任何字节—我试图从中获取信息的程序的CPU使用率高达100%。一些消息,如WM\u GETTEXT,由Windows为您封送。这就是为什么您可以跨进程边界检索窗口的文本EM_STREAMIN/OUT不会自动封送。这就是你的代码崩溃的原因。EDITSTREAM结构和回

我正在尝试从另一个程序获取Richedit控件的文本

所以我找到了发送消息的EM_STREAMOUT

这是我到目前为止的代码(也是来自另一个Stackoverflow主题):


唯一发生的事情是SendMessage返回0—显然没有读取任何字节—我试图从中获取信息的程序的CPU使用率高达100%。

一些消息,如
WM\u GETTEXT
,由Windows为您封送。这就是为什么您可以跨进程边界检索窗口的文本<代码>EM_STREAMIN/OUT不会自动封送。这就是你的代码崩溃的原因。
EDITSTREAM
结构和回调代码必须存在于拥有RichEdit的同一进程的地址空间中


对于许多需要跨越进程边界的未封送消息,您可以使用
VirtualAllocEx()
分配输入/输出缓冲区,使用
WriteProcessMemory()
填充它们,并使用
ReadProcessMemory()
读取它们。但由于
EDITSTREAM
回调代码也需要在同一进程中,因此最好将整个
EM\u STREAMOUT
逻辑移动到DLL中,然后使用
CreateRemoteThread()
或其他注入技术将其注入目标进程。您可以使用
GetWindowThreadProcessId()
获取拥有RichEdit的进程/线程ID。然后,您的DLL可以检索RichEdit数据,并使用您选择的任何IPC(进程间通信)机制将其发送回主应用程序,如命名管道、邮箱、WM_COPYDATA消息等。

EM_STREAMOUT不会跨进程边界工作。你需要将你的代码注入到另一个进程中才能工作。但是使用WM_GETTEXT从普通编辑控件中读取文本可以很好地工作,我在MSDN中没有发现任何东西表明它不能跨进程边界工作。你在SO注释中找到了它。它是正确的。假设它是正确的-我如何从另一个程序的Richedit中获取文本?这一定是可能的,因为我可以在围绕WinAPI的AutoIt中实现。WM_GETTEXT可以工作,但是如果您想要格式化文本,您必须插入代码。或者只是利用。UIA支持检索RichEdit的RTF而不是纯文本吗?问题是“RichEdit控件的文本”。虽然UI自动化不允许直接访问RTF,但它提供了查询文本属性(如字体或颜色)的接口。问题可能是文本,但代码是RTF。而且必须扫描文本查询属性和范围以收集格式信息的效率非常低。
    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);

}