Показать сообщение отдельно
  #5  
Старый 21.02.2015, 22:03
DJDrugsounD DJDrugsounD вне форума
Прохожий
 
Регистрация: 29.06.2012
Сообщения: 11
Репутация: 10
По умолчанию

Нашёл вот такой код
Код:
procedure TForm1.GetListViewGrid(ALVHandle: HWND; AColumnCount, AItemCount: Integer; ADataGrid: TStringGrid);
const
cchTextMax=255;
var
  hProcess: THandle;
  dwProcessID: DWORD;
   dwWriten: SIZE_T;
  LVItemCount: Integer;
  i, j, nTextLength: Integer;
  pLVItem: ^LV_ITEM;
  LVItem: LV_ITEM;
  pszText: PChar;
  svText: ShortString;
begin
  if ALVHandle = 0 then Exit;
  // Получаем количество строк
  LVItemCount := ListView_GetItemCount(ALVHandle);
 if AItemCount > LVItemCount then exit;
 if AItemCount > 0 then LVItemCount:=AItemCount;
 //Получаем ID процесса, которому принадлежит найденное окно
 dwProcessID := 0;
  GetWindowThreadProcessId(ALVHandle, @dwProcessID);
 if dwProcessID = 0 then
  ExitProcess(GetLastError);
  // Открываем процесс
  hProcess := 0;
  hProcess := OpenProcess(PROCESS_ALL_ACCESS, True, dwProcessID);
  if hProcess = 0 then
  ExitProcess(GetLastError);
  // Выделяем в нем память под текстовый буффер
  pszText := VirtualAllocEx(hProcess, nil, cchTextMax,
                            MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
   // Выделяем в нем память под структуру LVITEM
  pLVItem := VirtualAllocEx(hProcess, nil, SizeOf(LV_ITEM),
                                     MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
  //Устанавливаем колич строк и столбцов в TStringGrid
  ADataGrid.RowCount := LVItemCount ;
  ADataGrid.ColCount := AColumnCount ;

  // Заполняем структуру
  ZeroMemory(@LVItem, SizeOf(LV_ITEM));
  LVItem.mask := LVIF_TEXT;
  LVItem.pszText := pszText;
  LVItem.cchTextMax := cchTextMax;

  //Считываем строки
  for i := 0 to LVItemCount - 1 do
  begin
    LVItem.iSubItem := 0;
    // Пишем ее в память удаленного процесса
    if not WriteProcessMemory(hProcess, pLVItem, @LVItem,
                 SizeOf(LV_ITEM), dwWriten) then Exit;
    nTextLength := SendMessage(ALVHandle, LVM_GETITEMTEXT,
                                i, Integer(pLVItem));
    // Читаем результат
    ZeroMemory(@svText, cchTextMax);
    ReadProcessMemory(hProcess, LVItem.pszText, @svText[1],
     nTextLength, dwWriten);
     //заполняем строки TStringGrid
    ADataGrid.Cells[0, i + 1] := StrPas(PChar(@svText[1]));
    Memo1.Lines.Add(StrPas(PChar(@svText[1])));
   //Считываем столбцы
   for j := 0 to AColumnCount - 1 do
    begin
      LVItem.iSubItem := j;
      // Пишем ее в память удаленного процесса
      if not WriteProcessMemory(hProcess, pLVItem, @LVItem,
                                SizeOf(LV_ITEM), dwWriten) then Exit;
      nTextLength := SendMessage(ALVHandle, LVM_GETITEMTEXT,
                                 i, Integer(pLVItem));
      // Читаем результат
      ZeroMemory(@svText, cchTextMax);
      ReadProcessMemory(hProcess, LVItem.pszText,
                        @svText[1], nTextLength, dwWriten);
      //заполняем столбцы TStringGrid
      ADataGrid.Cells[j + 1, i + 1] := StrPas(PChar(@svText[1]));
    end;
  end;

 // Освобождаем ранее выделенную память
  VirtualFreeEx(hProcess, pszText, 0, MEM_RELEASE);
  VirtualFreeEx(hProcess, pLVItem, 0, MEM_RELEASE);
  // Закрываем описатель процесса
  CloseHandle(hProcess);
end;

по идеи должен считать названия всех элементов рабочего стола. Не работает, вместо текста каждого элемента пустое значение.
Ответить с цитированием