Re[2]: Спасибо, но ...
От: migel  
Дата: 09.11.01 20:18
Оценка:
Здравствуйте Willi, Вы писали:

W>Здравствуйте Migo, Вы писали:


M>> Handle edit-a я получил — не проблема, а посылать WM_GETTEWT то же самое, что вызывать GetWindowText. Я пробовал и то и другое. Результат — пустая строка ...


W>Лично я только что попробовал предложенный вариант.

W>Прекрасно работает, но только со стандартным Edit Control
W>вот кусочек кода

W>[vc]

W> UpdateData();

W> HWND hWnd;

W> _stscanf(m_sHandle, _T("%X"), &hWnd);

W> if(!::IsWindow(hWnd))

W> {
W> AfxMessageBox(_T("Invalid Handle"));
W> return;
W> }

W> ::SendMessage(hWnd, WM_GETTEXT, 1024, (LPARAM)m_sText.GetBuffer(1024));

W> m_sText.ReleaseBuffer();

W> UpdateData(FALSE);

W>[/vc]

Не ребята так не пойдет Ж-) так как контрол принадлежит другому процессу то и память ему нужно в сообщении довать принадлежащую процессу..
Вот как надо:
// return size of the text
DWORD GetWindowTextAnotherProcess(HWND hwnd, LPSTR szBuffer, DWORD dwBufferSize) 
{ 
if (hwnd == NULL) 
    return 0; 
DWORD dwProcessId; 
GetWindowThreadProcessId(hwnd, &dwProcessId); 
HANDLE hProcess = OpenProcess( 
PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, 
FALSE, dwProcessId); 
if (hProcess == NULL) { 
return 0; 
} 
DWORD dwLen = SendMessage(hwnd, WM_GETTEXTLENGT, 0, 0);
DWORD dwSizeToCopy = min(dwBufferSize, dwLen);
LPSTR lpsz = (LPSTR) VirtualAllocEx(hProcess, 
NULL, 4096, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 
if (!lpsz)
return 0;
dwSizeToCopy = SendMessage(hwnd, WM_GETTEXT, dwSizeToCopy, (LPARAM)lpsz);
ReadProcessMemory(hProcess, lpsz,  szBuffer, dwSizeToCopy, NULL); 
VirtualFreeEx(hProcess, lpsz, 0, MEM_RELEASE); 
return dwSizeToCopy;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.