Ну чтож ты сразу не сказал что с чужим процессом пытаешся работать? Границы процесса нам не помеха.
Есть у меня функция которая получает текст из 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;
}