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??
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??
Wszelkie bufory musisz alokować w tamtym procesie (VirtualAllocEx), inicjować je - WriteProcessMemory, wysłać SendMessage i sobie te dane odczytać - ReadProcessMemory.
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.
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;
}
ale jest jeden problem uchwyt do ListView za kazdym odpaleniem prgramu jest inny. Jak moge wyszukac go na podstawie nazwy ??