Техника захвата данных из списков

Тема в разделе "WASM.RESEARCH", создана пользователем bloom, 13 дек 2005.

  1. bloom

    bloom New Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    1
    Часто приходится извлекать данные из списков программ (будь то телефонный справочник или что-нибудь другое)

    чаще всего - это ListBox или SysListView32

    в этом случае помогает следующий код
    Код (Text):
    1. var
    2. ProcessId: DWORD;
    3. Process: THandle;
    4. vPointer: Pointer;
    5. Buffer: array [byte] of char;
    6. NumberOfBytesRead: Cardinal;
    7. Item: TLVItem;
    8. hListView:HWND;
    9. ItemsCount,i:integer;
    10.  
    11. begin
    12.  
    13. hListView:=$000B028C;
    14. GetWindowThreadProcessId(hListView, @ProcessId);
    15. Process := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, ProcessId);
    16.  
    17. vPointer := VirtualAllocEx(Process, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
    18. ItemsCount := SendMessage(hListView, LVM_GETITEMCOUNT, 0, 0);
    19.  
    20. try
    21. for i := 0 to ItemsCount do begin
    22. with Item do begin
    23. mask := LVIF_TEXT;
    24. iItem := i;
    25. iSubItem := 0;
    26. cchTextMax := SizeOf(Buffer);
    27. pszText := Pointer(Cardinal(vPointer) + SizeOf(TLVItem));
    28. end;
    29. WriteProcessMemory(Process, vPointer, @Item, SizeOf(TLVItem), NumberOfBytesRead);
    30. SendMessage(hListView, LVM_GETITEM , I, lparam(vPointer));
    31. ReadProcessMemory(Process, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)), @Buffer[0], SizeOf(Buffer), NumberOfBytesRead);
    32.  
    33. memo1.Lines.Add(Buffer);
    34.  
    35. end;
    36. finally
    37. VirtualFreeEx(Process, vPointer, 0, MEM_RELEASE);
    38. CloseHandle(Process);
    39. end;
    40. end;






    однако иногда попадаются экзотические классы окон

    например KAVGUI_ListCtrl в 5-м Касперском

    как извлечь данные из такого списка ?? куда копать ? код выше не работает..





    [​IMG]