[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