Показать сообщение отдельно
Старый 01.11.2004, 11:13     # 3
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
Ну чтож ты сразу не сказал что с чужим процессом пытаешся работать? Границы процесса нам не помеха.
Есть у меня функция которая получает текст из ListCtrl чужого процесса. По аналогии и поиск сделать можно. Работает на кернелах NT, если нужно будет для Win9x , напиши, есть код и для него.
Код:
typedef LPVOID (__stdcall * PFNVIRTALLEX)(HANDLE, LPVOID, DWORD, DWORD,DWORD);

__declspec(dllexport) CString GetListCtrlItemText(HWND hWnd,int iItem,int subItem)
{
	
	CString strItemText="";
	CString tmp="";
	char ClassName[255];
	HWND hHeaderCtrl=NULL;
	if(!hWnd || !IsWindow(hWnd))
		return strItemText;
	::GetClassName(hWnd,ClassName,254);
	tmp=ClassName;
	tmp.MakeUpper();
	if(tmp.Find("LISTVIEW")<0)
		return strItemText;
	//long stl=::GetWindowLong(GWL_STYLE);
	hHeaderCtrl=ListView_GetHeader(hWnd);
	if(!hHeaderCtrl)
		return strItemText;
	int iSubItemCount=Header_GetItemCount (hHeaderCtrl);
	if(iSubItemCount<=0 || (iSubItemCount-1)<subItem)
		return strItemText;
	int iItemCount = ListView_GetItemCount(hWnd);
	if(iItemCount==0 || (iItemCount-1)<iItem)
		return strItemText;
	

	DWORD dwProcessId;
    HANDLE hProcess;
    PFNVIRTALLEX pfnVirtualAllocEx;
	LV_ITEM *pLVItem;
	LV_ITEM LVItem;
	char Buffer[255] = "\n";

	GetWindowThreadProcessId(hWnd, &dwProcessId);
    hProcess = OpenProcess( PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, dwProcessId);
    if (hProcess == NULL)
    {
        MessageBox(NULL,"Could not communicate with process","", MB_OK | MB_ICONWARNING);  //MMHELPER_WARNING
        return strItemText;
    }

	// Allocate memory in the remote process's address space

	//get procAddress this way so the code can be compiled on win 95/98
    pfnVirtualAllocEx = (PFNVIRTALLEX) GetProcAddress(GetModuleHandle("KERNEL32.DLL"),"VirtualAllocEx");

    pLVItem = (LV_ITEM*) pfnVirtualAllocEx(hProcess, NULL, sizeof(LV_ITEM)+255, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    LVItem.mask = LVIF_TEXT;
    LVItem.pszText = (LPTSTR) (pLVItem + 1) ;
    LVItem.cchTextMax = 255;
	LVItem.iSubItem = subItem;
// Write the local LV_ITEM structure to the remote memory block
    WriteProcessMemory(hProcess, pLVItem, &LVItem, sizeof(LVItem), NULL);
    ::SendMessage(hWnd,LVM_GETITEMTEXT,(WPARAM)iItem,(LPARAM)pLVItem);
// Read the remote text string into the end of our clipboard buffer
    ReadProcessMemory(hProcess, pLVItem + 1,Buffer, 254, NULL);
// Free the memory in the remote process's address space
    VirtualFreeEx(hProcess, pLVItem, 0, MEM_RELEASE);
    CloseHandle(hProcess);
	strItemText=Buffer;
	return strItemText;	
}
__________________
Best Regards

Последний раз редактировалось alexey_ma; 01.11.2004 в 11:34.
alexey_ma вне форума