IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Поиск элемента в ListView (http://www.imho.ws/showthread.php?t=72381)

Merlyel 31.10.2004 21:11

Поиск элемента в 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 01.11.2004 00:51

Ответ нашел сам :)

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

Ну соответственно я и пытался "преодолеть границы процессов." :(

alexey_ma 01.11.2004 11:13

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


Merlyel 01.11.2004 22:58

Кабы знал, что в этом была проблема, сказал бы :)


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

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