[VC++] Dostęp do danych TListView innego okna

0

Witam!

Wlasnie sie zastanawiam jak pobrać dane z TListView innego okna. Mam uchwyt tego okna i nazwe klasy TListView (zebralem to Spy++).

A jeśli juz mam te dane to czy juz jestem w stanie wyciagać te dane?? Czy musze jeszcze jakies funkcje dac??

0

Wszelkie bufory musisz alokować w tamtym procesie (VirtualAllocEx), inicjować je - WriteProcessMemory, wysłać SendMessage i sobie te dane odczytać - ReadProcessMemory.

0

ja chce tylko odczytywac czyli musze uzyc jedynie ReadProcessMemory() ??

w niej jest parametr HANDLE hProcess.
Nie wiem czy dobrze mysle. uchwyt tego procesu dostane poprzes uzycie funkcji OpenProcess(). Chyba ze trzeba jakos inaczej. Spy++ dal mi Uchwyt okna glownego, Control ID, i class name.

0

Zdobądź hwnd jakiegoś listview i podmień w main:

#include <windows.h>
#include <commctrl.h>

HANDLE _heap;
#define AllocHeap(x) HeapAlloc(_heap, HEAP_ZERO_MEMORY, x)
#define FreeHeap(x)  HeapFree(_heap, 0, x)

// zwraca ansi lub unicode string
TCHAR* Remote_ListView_GetItemText(HANDLE hProcess,HWND hwnd,int item,int subitem)
{
    TCHAR *lpString = (TCHAR*)0;

    LVITEMA lvi;
    lvi.iSubItem   = subitem;
    lvi.cchTextMax = (4096 - sizeof(LVITEM)) / sizeof(TCHAR);

    // alokuj pamięć w procesie dla LVITEM
    void *pRemoteMem = (void*)VirtualAllocEx(hProcess, 0, 4096, MEM_COMMIT, PAGE_READWRITE);
    if (!pRemoteMem) return 0;

    // ustaw bufor stringa za strukturą
    lvi.pszText = (char*)pRemoteMem + sizeof(lvi);

    // skopiuj LVITEM do procesu
    DWORD dw;
    WriteProcessMemory(hProcess, pRemoteMem, &lvi, sizeof(lvi), &dw);

    int iCharacters = SendMessage(hwnd, LVM_GETITEMTEXT, item, (LPARAM)pRemoteMem);

    if (iCharacters > 0)
    {
        // odczytaj tekst z procesu
        lpString = (TCHAR*)AllocHeap((iCharacters+1) * sizeof(TCHAR));
        if (lpString)
            ReadProcessMemory(hProcess, (void*)lvi.pszText, lpString, iCharacters * sizeof(TCHAR), &dw);
    }
    // zwolnij pamięć
    VirtualFreeEx(hProcess, pRemoteMem, 4096, MEM_RELEASE);
    return lpString;
}

int main()
{
    _heap = GetProcessHeap();
    HWND hwnd = (HWND)0x006F05C8; // SysListView32
    if (!IsWindow(hwnd))
        return MessageBox(0, TEXT("Invalid window"), TEXT(""), 0);

    DWORD pid;
    GetWindowThreadProcessId(hwnd, &pid);

    HANDLE hProcess = OpenProcess(PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_VM_OPERATION,
        false, pid);

    if (!hProcess) MessageBox(0, TEXT("OpenProcess failed"), TEXT(""), 0); else
    {
        TCHAR *lpString = Remote_ListView_GetItemText(hProcess, hwnd, 0, 0);
        if (!lpString) MessageBox(0, TEXT("GetItemText failed"), TEXT(""), 0); else
        {
            MessageBox(0, (TCHAR*)lpString, TEXT(""), 0);
            FreeHeap(lpString);
        }
        CloseHandle(hProcess);
    }
    return 0;
}
0

ale jest jeden problem uchwyt do ListView za kazdym odpaleniem prgramu jest inny. Jak moge wyszukac go na podstawie nazwy ??

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0