![](/img/trans.png)
[英]Can't figure out how to set the value of EM_SETLIMITTEXT with winapi in c++
[英]WinAPI EM_STREAMOUT crash
我正在嘗試從另一個程序獲取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%。
Windows為您封送了一些消息,例如WM_GETTEXT
。 這就是為什么您可以跨過程邊界檢索窗口的文本。 EM_STREAMIN/OUT
未自動封送。 這就是為什么您的代碼崩潰的原因。 EDITSTREAM
結構和回調代碼必須存在於擁有RichEdit的同一進程的地址空間中。
對於許多需要跨越進程邊界的非編組消息,可以使用VirtualAllocEx()
分配輸入/輸出緩沖區,使用WriteProcessMemory()
填充它們,並使用ReadProcessMemory()
從中讀取。 但是,由於EDITSTREAM
回調代碼也需要處於同一進程中,因此最好將整個EM_STREAMOUT
邏輯移到DLL中,然后使用CreateRemoteThread()
或其他注入技術將其注入到目標進程中。 您可以使用GetWindowThreadProcessId()
獲取擁有RichEdit的進程/線程ID。 然后,您的DLL可以檢索RichEdit數據,並使用您選擇的任何IPC(進程間通信)機制將其發送回您的主應用程序,例如命名管道,郵筒, WM_COPYDATA
消息等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.