CListCtrl - problem

0

Witam,

jest sobie jakiś tam program który ma kontrolkę listy CListCtrl, Styl REPORT, OWNER_DRAW i OWNER_DATA.

muszę pobierać dane dla każdego nowego elementu (każdy skłąda się z 3 subitems).
Kluczowa jest prędkość działania, czyli odczytu tej listy i wstawieniu do mojego programu:
dla ułatwienia każdy nowy element włazi na pozycję 0,. Mogę znaleźć uchwyt listy więc:

// Zliczanie elementów robię tak

int getItemCount(HWND mHwnd)
{
	return((int)SendMessage(mHwnd, LVM_GETITEMCOUNT, 0, 0));
}

//odczyt danego elementu robię tak

LPSTR getItem(HWND listview, int nItem, int nType)
{
	int i;
	LVITEM lvi, *_lvi;
	char item[512], subitem[512];
	char *_item, *_subitem;
	unsigned long pid;
	HANDLE process;
	LPSTR lps="";

	GetWindowThreadProcessId(listview, &pid);
	process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid);
	_lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM),MEM_COMMIT, PAGE_READWRITE);
	_item=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,PAGE_READWRITE);	
	_subitem=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,PAGE_READWRITE);	
	lvi.cchTextMax=512;

	i=nItem;


	if(nType==0)
	{
		lvi.iSubItem=0;
		lvi.pszText=_item;
	
		WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
		SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);
		ReadProcessMemory(process, _item, item, 512, NULL);
		lps=item;
	}
	if(nType==1)
	{
		lvi.iSubItem=1;
		lvi.pszText=_subitem;
	
		WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
		SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);
		ReadProcessMemory(process, _subitem, subitem, 512, NULL);
		lps=subitem;
	}
				
	VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);				
	VirtualFreeEx(process, _item, 0, MEM_RELEASE);
	VirtualFreeEx(process, _subitem, 0, MEM_RELEASE);		

	free(_lvi);
	free(_item);
	free(_subitem);
	
return(lps);
}

i wszystko byłoby pięknie gdyby nie fakt że odczyt listy jestem zmuszony robic w dość durny sposób, a mianowicie w pętli while(hwnd!=NULL)
tracę przez to zasoby procesora i jest to dość mało wydajny sposób gdyż w pętli w kółko porównywane są ostatnie element dla weryfikacji czy "wskoczyło" coś nowego czy też nie. zaznaczam że nowe elementy różnie wchodzą od 1 do nawet 6-8 w danej chwili.

Pytanie za duże piwo - Jak przechwycić z tej zewnętrznej aplikacji zdarzenie bodajże LVN_ITEMNOTIFY (a może LV_DISPINFO ??? )
lista jest wirtualna to chyba to 2-gie, ale zastanawiam sie ciagle jak przechwycic ten komunikat do swojego programu ????

dzieki za pomoc!

0

naprawde nikt nie pomoże ????? :(

0

Jedyne co mi przyszlo ma mysl po przeczytaniu Twojego problemu to "odwrócic" komunikacje pomiedzy programami.
Skoro jesteś w stanie znaleźć aktualne HWND docelowego ListView, to normalne win32 okno i jestes tez w stanie wczepic sie w jego chain WndProc'ow. W takim razie, wstrzel mu swoja małą DLL'kę z jedna funkcja "X", w dllmain wykonaj wyszukiwanie hwnd i od razu nakaz doczepienie do chain'a WndProcow tegoż HWND owej funkcji X. Funkcja X niech ma sygnature zgodna z normalnym wndproc, niech sobie oglada przelatujace MSG i zawsze zwraca ze "nie obslużono" (bodajże false) - ale po cichu, jeżeli bedzie to LVM_ITEMNOTIFY, to niech ona wysle sygnal/wiadomosc/etc do programu obserwujacego ze cos sie zmienilo. ba, moze nawet od razu mu wyslac dane - przeciez ma je pod reka

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