Handle edit-a я получил — не проблема, а посылать WM_GETTEWT то же самое, что вызывать GetWindowText. Я пробовал и то и другое. Результат — пустая строка ...
Здравствуйте 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;