gpt4 book ai didi

c++ - WinAPI EM_STREAMOUT 崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 03:49:18 29 4
gpt4 key购买 nike

我正在尝试从另一个程序获取 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%。

最佳答案

某些消息,如 WM_GETTEXT,由 Windows 为您整理。这就是您可以跨进程边界检索窗口文本的原因。 EM_STREAMIN/OUT 不是自动编码的。这就是您的代码崩溃的原因。 EDITSTREAM 结构和回调代码必须存在于拥有 RichEdit 的同一进程的地址空间中。

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

关于c++ - WinAPI EM_STREAMOUT 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21961826/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com