imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 31.10.2004, 21:11     # 1
Merlyel
Junior Member
 
Регистрация: 10.08.2003
Сообщения: 189

Merlyel Реально крут(а)Merlyel Реально крут(а)Merlyel Реально крут(а)Merlyel Реально крут(а)
Поиск элемента в ListView

Люди, помогите, что в этом куске кода неправильно:

LVFINDINFO info = {0};
info.flags=LVFI_STRING|LVFI_PARTIAL|LVFI_WRAP;
info.psz="Text";
int itemidx=0;

itemidx = SendMessage(hTarget, LVM_FINDITEM, -1, (LPARAM) (const LVFINDINFO *)&info);

Этот код должен искать элемент, начинающийся с "Text", однако он все время возвращает либо -1 (не найден), либо ссылки на другие элементы
Если затем попробовать что-нить другое делать с этим списком (например сообщением LVM_SETITEMPOSITION), то оно работает. А вот поиск - никак

Последний раз редактировалось Merlyel; 31.10.2004 в 22:12.
Merlyel вне форума  
Старый 01.11.2004, 00:51     # 2
Merlyel
Junior Member
 
Регистрация: 10.08.2003
Сообщения: 189

Merlyel Реально крут(а)Merlyel Реально крут(а)Merlyel Реально крут(а)Merlyel Реально крут(а)
Ответ нашел сам

by Рихтер:
"Проблема в том, что большинство оконных сообщений для стандартных элементов управления (например, LVM_GETITEM и LVM_GETITEMPOSITION) не может преодолеть границы процессов."

Ну соответственно я и пытался "преодолеть границы процессов."
Merlyel вне форума  
Старый 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 вне форума  
Старый 01.11.2004, 22:58     # 4
Merlyel
Junior Member
 
Регистрация: 10.08.2003
Сообщения: 189

Merlyel Реально крут(а)Merlyel Реально крут(а)Merlyel Реально крут(а)Merlyel Реально крут(а)
Кабы знал, что в этом была проблема, сказал бы
Merlyel вне форума  

Опции темы

Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 23:53.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.