Спасибо, но ...
От: Migo  
Дата: 09.11.01 13:43
Оценка:
Handle edit-a я получил — не проблема, а посылать WM_GETTEWT то же самое, что вызывать GetWindowText. Я пробовал и то и другое. Результат — пустая строка ...
Re: Спасибо, но ...
От: Willi  
Дата: 09.11.01 13:56
Оценка:
Здравствуйте Migo, Вы писали:

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


Лично я только что попробовал предложенный вариант.
Прекрасно работает, но только со стандартным Edit Control
вот кусочек кода

[vc]
UpdateData();

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

if(!::IsWindow(hWnd))
{
AfxMessageBox(_T("Invalid Handle"));
return;
}

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

UpdateData(FALSE);
[/vc]
\/\/i||i
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;
Re[3]: Спасибо, но ...
От: Sasparella США  
Дата: 09.11.01 20:42
Оценка:
Здравствуйте migel, Вы писали:

M>Не ребята так не пойдет Ж-) так как контрол принадлежит другому процессу то и память ему нужно в сообщении довать принадлежащую процессу..


Насколько я знаю, сообшения типа WM_GRTTEXT, и подобные, пришедшие со времен win16, специально обрабатываются операционной системой — то есть всю работу по аллокированию и копированию буфферов выполняет для этих сообщений операционка. Это сделано для совестимости со старыми программами. Потому приведеный код отлично работает.


Саша.
Re[4]: Спасибо, но ...
От: migel  
Дата: 11.11.01 11:57
Оценка:
Здравствуйте Sasparella, Вы писали:

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


M>>Не ребята так не пойдет Ж-) так как контрол принадлежит другому процессу то и память ему нужно в сообщении довать принадлежащую процессу..


S>Насколько я знаю, сообшения типа WM_GRTTEXT, и подобные, пришедшие со времен win16, специально обрабатываются операционной системой — то есть всю работу по аллокированию и копированию буфферов выполняет для этих сообщений операционка. Это сделано для совестимости со старыми программами. Потому приведеный код отлично работает.



S>Саша.

Хм, действительно — перечитал Рихтера — МС делает за нас :-), Но не все.
Тогда становиться интересно почему у товарисча не работает.. Может кусок кода покажите, да побольше?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.