есть такой вот код Код (Text): HWND hwnd = findWindow (L"Statistic Viewer", SUBSTR); HWND hctl = findControl (hwnd, L"SysTreeView32", 1); res = SendMessage (hctl, TVM_GETNEXTITEM, TVGN_ROOT, 0); tvi.hItem = (HTREEITEM)res; tvi.mask = TVIF_TEXT; wchar_t buf[64]; tvi.pszText = buf; tvi.cchTextMax = 64; SendMessage(hctl, TVM_GETITEM, NULL, (LPARAM)&tvi); Если он встроен в приложение которое создает окно, в buf появляется текст первого item. А вот если из другого приложения, то нет. Но при этом некоторые другие сообщения работают, например TVM_EXPAND. Есть ли нормальный способ, или надо что-то типа CreateRemoteThread использовать?
Это же не COPY_DATA сообщение. Оно копирует данные в АП процесса из одного места в другое. Кросс-АП копирование, естественно, не поддерживается.
Спасиб, решил вот так Код (Text): TV_ITEM tvi; LRESULT res; wchar_t buf[64]; HWND hwnd = findWindow (L"TreeDemo", SUBSTR); HWND hctl = findControl (hwnd, L"SysTreeView32", 1); res = SendMessage (hctl, TVM_GETNEXTITEM, TVGN_ROOT, 0); res = SendMessage (hctl, TVM_GETNEXTITEM, TVGN_CHILD, res); DWORD dwProcessId; GetWindowThreadProcessId(hctl, &dwProcessId); HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, dwProcessId); LPTVITEM lp = (LPTVITEM) VirtualAllocEx(hProcess, NULL, sizeof(TVITEM) + 128, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); tvi.hItem = (HTREEITEM)res; tvi.mask = TVIF_TEXT; tvi.pszText = (LPWSTR) (lp + 1); tvi.cchTextMax = 64; SendMessage(hctl, TVM_GETITEM, NULL, (LPARAM)&tvi); WriteProcessMemory(hProcess, lp, &tvi, sizeof(tvi), NULL); TreeView_GetItem (hctl, lp); ReadProcessMemory(hProcess, lp + 1, buf, 128, NULL); // читаем только буфер за структурой VirtualFreeEx(hProcess, lp, 0, MEM_RELEASE); CloseHandle(hProcess); return 0; } И вот еще вопрос, почему не работает SendMessage (hctl, TVM_SELECTITEM, TVGN_CARET, (LPARAM) res); ?