прочесть итемы из чужого SysListView

Тема в разделе "WASM.WIN32", создана пользователем loleg, 23 июл 2010.

  1. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
    читаю вот таким кодом, но чужой SysListView содержит 4 поля под каждый итем, этот код читает только первое поля, как корректно прочесть все поля?

    Код (Text):
    1.  hwndRemoteSysListView := $0001023C;
    2.  if hwndRemoteSysListView = 0 then ExitProcess(GetLastError);
    3.  
    4.  nItemCount := ListView_GetItemCount(hwndRemoteSysListView);
    5.  
    6.  // Получаем ID процесса, которому принадлежит найденное окно
    7.  GetWindowThreadProcessId(hwndRemoteSysListView, @dwProcessID);
    8.  if dwProcessID = 0 then ExitProcess(GetLastError);
    9.  
    10.  // Открываем процесс
    11.  hProcess := OpenProcess(PROCESS_ALL_ACCESS, TRUE, dwProcessID);
    12.  if hProcess = 0 then ExitProcess(GetLastError);
    13.  
    14.  // Выделяем в нем память под текстовый буффер
    15.  pszText := VirtualAllocEx(hProcess, nil, cchTextMax,
    16.   MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
    17.  
    18.  // Выделяем в нем память под структуру LVITEM
    19.  plviRemoteLVItem := VirtualAllocEx(hProcess, nil, SizeOf(LV_ITEM),
    20.   MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
    21.  
    22.  // Заполняем структуру
    23.  ZeroMemory(@lviRemoteLVItem, SizeOf(LV_ITEM));
    24.  lviRemoteLVItem.mask := LVIF_TEXT;
    25.  lviRemoteLVItem.pszText := pszText;
    26.  lviRemoteLVItem.cchTextMax := cchTextMax;
    27.  
    28.  // Пишем ее в память удаленного процесса
    29.  if not WriteProcessMemory(hProcess, plviRemoteLVItem, @lviRemoteLVItem,
    30.    SizeOf(LV_ITEM), dwBytesWriten) then ExitProcess(GetLastError);
    31.  
    32.  // Выделяем в нем память под структуру TRect
    33.  pRemoteRect := VirtualAllocEx(hProcess, nil, SizeOf(TRect),
    34.   MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
    35.  
    36.  // Получаем текст со всех элементов
    37.  for I := 0 to nItemCount - 1 do
    38.  begin
    39.    // Отправляем сообщение с указателем на выделенный буффер под LVITEM
    40.    nTextLength := SendMessage(hwndRemoteSysListView, LVM_GETITEMTEXT,
    41.      I, Integer(plviRemoteLVItem));
    42.  
    43.    // Читаем результат
    44.    ZeroMemory(@svText, cchTextMax);
    45.    ReadProcessMemory(hProcess, lviRemoteLVItem.pszText,
    46.      @svText[1], nTextLength, dwBytesWriten);
    47.  
    48.    // Чтобы получить координаты каждого элемента нужно подготовить структуру
    49.    ZeroMemory(@ARect, SizeOf(TRect));
    50.    ARect.Left := LVIR_ICON;
    51.    if not WriteProcessMemory(hProcess, pRemoteRect, @ARect,
    52.      SizeOf(TRect), dwBytesWriten) then ExitProcess(GetLastError);
    53.  
    54.    // Посылаем сообщение для получения координат каждого элемента
    55.    SendMessage(hwndRemoteSysListView, LVM_GETITEMRECT,
    56.      I, Integer(pRemoteRect));
    57.  
    58.    // Читаем результат
    59.    ReadProcessMemory(hProcess, pRemoteRect,
    60.      @ARect, SizeOf(TRect), dwBytesWriten);
    61.  
    62.    Writeln(Translate(PChar(@svText[1])));
    63.    Writeln(Translate(
    64.      Format('- координаты: Left = %d, Top = %d, Right = %d, Bottom = %d',
    65.        [ARect.Left, ARect.Top, ARect.Right, ARect.Bottom])));
    66.  
    67.  end;
    68.  
    69.  // Освобождаем ранее выделенную память
    70.  VirtualFreeEx(hProcess, pszText, 0, MEM_RELEASE);
    71.  VirtualFreeEx(hProcess, plviRemoteLVItem, 0, MEM_RELEASE);
    72.  
    73.  // Закрываем описатель процесса
    74.  CloseHandle(hProcess);
    75.  
    76. end.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    насколько я помню, там у каждого элемента есть подэлементы (sub-item), как их читать есть в msdn'e.
     
  3. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
    нет это SysListView, а не TreeView
    [​IMG]
     
  4. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    noname правду говорит, у ListView, как ни странно, вторая и последующие колонки тоже являются subitem'ами первой. Нормального ...Grid без выгибонов Микрософт не родила.
     
  5. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
    так и есть, всем спасибо, при чтении нужно было всеголишь установить LVItem.iSubItem := X, где X - номер колонки в записи
     
  6. loleg

    loleg New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    93
    как программно нажать Enter в ListBox'е? не работают ни PostMessage WM_CHAR 13, ни WM_KEYDOWN VK_RETURN и даже keybd_event