SendMessage чужому SysTreeView32

Тема в разделе "WASM.WIN32", создана пользователем letopisec, 2 фев 2009.

  1. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    есть такой вот код

    Код (Text):
    1.     HWND hwnd = findWindow (L"Statistic Viewer", SUBSTR);
    2.     HWND hctl = findControl (hwnd, L"SysTreeView32", 1);
    3.     res = SendMessage (hctl, TVM_GETNEXTITEM, TVGN_ROOT, 0);
    4.  
    5.     tvi.hItem = (HTREEITEM)res;
    6.     tvi.mask = TVIF_TEXT;
    7.     wchar_t buf[64];
    8.     tvi.pszText = buf;
    9.     tvi.cchTextMax = 64;
    10.     SendMessage(hctl, TVM_GETITEM, NULL, (LPARAM)&tvi);
    Если он встроен в приложение которое создает окно, в buf появляется текст первого item. А вот если из другого приложения, то нет. Но при этом некоторые другие сообщения работают, например TVM_EXPAND. Есть ли нормальный способ, или надо что-то типа CreateRemoteThread использовать?
     
  2. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Это же не COPY_DATA сообщение. Оно копирует данные в АП процесса из одного места в другое. Кросс-АП копирование, естественно, не поддерживается.
     
  3. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    Спасиб, решил вот так

    Код (Text):
    1.     TV_ITEM tvi;
    2.     LRESULT res;
    3.     wchar_t buf[64];
    4.  
    5.     HWND hwnd = findWindow (L"TreeDemo", SUBSTR);
    6.     HWND hctl = findControl (hwnd, L"SysTreeView32", 1);
    7.  
    8.     res = SendMessage (hctl, TVM_GETNEXTITEM, TVGN_ROOT, 0);
    9.     res = SendMessage (hctl, TVM_GETNEXTITEM, TVGN_CHILD, res);
    10.  
    11.     DWORD dwProcessId;
    12.     GetWindowThreadProcessId(hctl, &dwProcessId);
    13.     HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, dwProcessId);
    14.  
    15.     LPTVITEM lp   = (LPTVITEM) VirtualAllocEx(hProcess, NULL, sizeof(TVITEM) + 128, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    16.  
    17.  
    18.     tvi.hItem = (HTREEITEM)res;
    19.     tvi.mask = TVIF_TEXT;
    20.     tvi.pszText = (LPWSTR) (lp + 1);
    21.     tvi.cchTextMax = 64;
    22.     SendMessage(hctl, TVM_GETITEM, NULL, (LPARAM)&tvi);
    23.  
    24.     WriteProcessMemory(hProcess, lp, &tvi, sizeof(tvi), NULL);
    25.     TreeView_GetItem (hctl, lp);
    26.     ReadProcessMemory(hProcess, lp + 1, buf, 128, NULL); // читаем только буфер за структурой
    27.  
    28.     VirtualFreeEx(hProcess, lp, 0, MEM_RELEASE);
    29.     CloseHandle(hProcess);
    30.  
    31.     return 0;
    32. }
    И вот еще вопрос, почему не работает SendMessage (hctl, TVM_SELECTITEM, TVGN_CARET, (LPARAM) res);
    ?