2014-02-22 2 views
1

다른 프로그램에서 Richedit 컨트롤의 텍스트를 가져 오려고합니다.WinAPI EM_STREAMOUT crash

그래서 SendMessage에 대해 EM_STREAMOUT이 발견되었습니다.

이 내 코드는 지금까지 (또 다른 유래 항목에서)입니다 : 발생

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 반환입니다 - 그래서 분명히 바이트를 읽고되지 않았다 - 내가 '어느 프로그램 정보를 얻으려고하면 최대 100 % CPU 사용량이됩니다.

+2

EM_STREAMOUT 원 프로세스 경계를 ​​넘어서 일하지 않습니다. 이 작업을 수행하려면 코드를 다른 프로세스에 삽입해야합니다. –

+0

그러나 WM_GETTEXT로 일반 편집 컨트롤에서 텍스트를 읽는 것이 좋으며 MSDN에서 프로세스 경계를 ​​넘어서 작동하지 않는다는 것을 찾지 못했습니다. – user3342002

+2

SO 주석에서 발견했습니다. 맞습니다. –

답변

1

WM_GETTEXT과 같은 일부 메시지는 Windows에서 마샬링됩니다. 그래서 프로세스 경계에서 창 텍스트를 검색 할 수 있습니다. EM_STREAMIN/OUT은 자동 마샬링되지 않습니다. 이것이 코드가 충돌하는 이유입니다. EDITSTREAM 구조체와 콜백 코드는 RichEdit을 소유하고있는 동일한 프로세스의 주소 공간에 존재해야합니다.

프로세스 경계를 ​​넘어야하는 많은 마샬링되지 않은 메시지의 경우 VirtualAllocEx()을 사용하여 입력/출력 버퍼를 할당하고 WriteProcessMemory()을 사용하여 채우고 ReadProcessMemory()을 사용하여 읽습니다. 그러나 EDITSTREAM 콜백 코드는 동일한 프로세스에 있어야하므로 전체 EM_STREAMOUT 논리를 DLL로 이동 한 다음 CreateRemoteThread() 또는 다른 주입 기술을 사용하여 대상 프로세스에 주입하는 것이 가장 좋습니다. GetWindowThreadProcessId()을 사용하여 RichEdit를 소유 한 프로세스/스레드 ID를 가져올 수 있습니다. 그런 다음 DLL은 RichEdit 데이터를 검색하여 이름이 지정된 파이프, 메일 슬롯, WM_COPYDATA 메시지 등 모든 IPC (프로세스 간 통신) 메커니즘을 사용하여 기본 앱으로 다시 전송할 수 있습니다.

+0

또는 [표준 컨트롤에 대한 UI 자동화 지원] (http : /msdn.microsoft.com/ko-kr/library/windows/desktop/ee671196.aspx). – IInspectable

+0

UIA는 일반 텍스트 대신 RichEdit의 RTF를 검색 할 수 있습니까? –

+0

질문은 * "RichEdit 컨트롤의 텍스트"*를 묻습니다. UI Automation은 RTF에 직접 액세스 할 수 없지만 글꼴 또는 색상과 같은 텍스트 속성을 쿼리하는 인터페이스를 제공합니다. – IInspectable