| imho.ws |
![]() |
|
|
|
# 1 |
|
Junior Member
Регистрация: 10.08.2003
Сообщения: 189
![]() ![]() ![]() ![]() |
Поиск элемента в 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. |
|
|
|
|
# 2 |
|
Junior Member
Регистрация: 10.08.2003
Сообщения: 189
![]() ![]() ![]() ![]() |
Ответ нашел сам
![]() by Рихтер: "Проблема в том, что большинство оконных сообщений для стандартных элементов управления (например, LVM_GETITEM и LVM_GETITEMPOSITION) не может преодолеть границы процессов." Ну соответственно я и пытался "преодолеть границы процессов."
|
|
|
|
|
# 3 |
|
Member
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245
![]() ![]() |
Ну чтож ты сразу не сказал что с чужим процессом пытаешся работать? Границы процесса нам не помеха.
Есть у меня функция которая получает текст из 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. |
|
|