И теперь могу добавить две вариации на тему SendMessage, которые предложили программисты тестируемого приложения
1) отсылать контейнеру сообщение WM_COMMAND с параметром Control ID - ид-шником контрола, который должен стандартно отработать.
т.е. такой вариант успешно нажал на кнопку тулбара:
SendMessage( hWndParent, WM_COMMAND, iBtnID);где iBtnID - ид-шник кнопки на тулбаре
2) посмотреть в хедер файле конкретного MFC контрола - какие мессаджи отрабатываютсья. так в afxtoolbar.h не было TB_GETRECT, но был TB_GETITEMRECT.
Дальше нужно посмотреть на значение, присвоенное этому месседжу. Если оно больше значения WM_USER - то просто так отправить не получиться, потому что нужно еще делать marshalling для передаваемых параметров.
см. http://www.piotrkalu...cs/ch02s04.html
в этом случае отработал такой вариант получения координат кнопки тулбара
HWND hWndParent = FindWindow(NULL, L"MFCToolbarTest - MFCToolbarTest1" + char(0)); HWND hWndParent1 = FindWindowEx(hWndParent,NULL,L"Afx:DockPane:400000:8:10011:10" + char(0), L"" + char(0)); HWND hWnd = FindWindowEx(hWndParent1,NULL,L"Afx:ToolBar:400000:8:10011:10" + char(0), L"Menu Bar" + char(0)); RECT tRect; DWORD pid = 0; GetWindowThreadProcessId( hWndParent, &pid ); HANDLE hProcHnd = OpenProcess( PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, pid ); LPVOID pRECT = VirtualAllocEx( hProcHnd, NULL, sizeof( RECT ), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); tRect.bottom = 0; tRect.left = 0; tRect.right = 0; tRect.top = 0; DWORD copied = 0; WriteProcessMemory( hProcHnd, pRECT, &tRect, sizeof( RECT ), &copied ); SendMessage( hWnd, TB_GETITEMRECT, (WPARAM)3, (LPARAM)pRECT ); ReadProcessMemory( hProcHnd, pRECT, (LPVOID)&tRect, sizeof( RECT ), &copied ); VirtualFreeEx( hProcHnd, pRECT, 0, MEM_RELEASE ); CloseHandle (hProcHnd); std::wcout << tRect.right << std::endl;