Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 25.06.2013, 12:26
Barsdg Barsdg вне форума
Прохожий
 
Регистрация: 02.06.2011
Сообщения: 24
Репутация: 10
По умолчанию

Всем спасибо, вопрос решен. Вот, если кому надо
Код:
procedure GetListViewGrid(ALVHandle: HWND; AColumnCount, AItemCount: Integer;
  ADataGrid: TStringGrid);
const
  cchTextMax=255;
var
  hProcess: THandle;
  dwProcessID: DWORD;
  dwWriten: DWORD;
  LVItemCount: Integer;
  i, j, nTextLength: Integer;
  pLVItem: ^LV_ITEMA;
  LVItem: LV_ITEMA;
  pszText: PAnsiChar;
  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_ITEMA), MEM_COMMIT or MEM_TOP_DOWN,
    PAGE_READWRITE);
  // Устанавливаем колич строк и столбцов в TStringGrid
  ADataGrid.RowCount := LVItemCount;
  ADataGrid.ColCount := AColumnCount;
  // Заполняем структуру
  ZeroMemory(@LVItem, SizeOf(LV_ITEMA));
  LVItem.Mask := LVIF_TEXT;
  LVItem.pszText := pszText;
  LVItem.cchTextMax := cchTextMax;
  // Считываем строки
  for i := 0 to LVItemCount do
  begin
    LVItem.iSubItem := 0;
    // Пишем ее в память удаленного процесса
    if not WriteProcessMemory(hProcess, pLVItem, @LVItem, SizeOf(LV_ITEMA), dwWriten) then
      Exit;
    nTextLength := SendMessageA(ALVHandle, LVM_GETITEMTEXTA, i, Integer(pLVItem));
    // Читаем результат
    ZeroMemory(@svText, cchTextMax);
    ReadProcessMemory(hProcess, LVItem.pszText, @svText[1], nTextLength, dwWriten);
    // заполняем строки TStringGrid
    ADataGrid.Cells[1, i+1] := StrPas(PAnsiChar(@svText[1]));
    // Считываем столбцы
    for j := 0 to AColumnCount do
    begin
      LVItem.iSubItem := j;
      // Пишем ее в память удаленного процесса
      if not WriteProcessMemory(hProcess, pLVItem, @LVItem, SizeOf(LV_ITEMA), dwWriten) then
        Exit;
      nTextLength := SendMessageA(ALVHandle, LVM_GETITEMTEXTA, i, Integer(pLVItem));
      // Читаем результат
      ZeroMemory(@svText, cchTextMax);
      ReadProcessMemory(hProcess, LVItem.pszText, @svText[1], nTextLength, dwWriten);
      // заполняем столбцы TStringGrid
      ADataGrid.Cells[j, i] := StrPas(PAnsiChar(@svText[1]));
    end;
  end;
  // Освобождаем ранее выделенную память
  VirtualFreeEx(hProcess, pszText, 0, MEM_RELEASE);
  VirtualFreeEx(hProcess, pLVItem, 0, MEM_RELEASE);
  // Закрываем описатель процесса
  CloseHandle(hProcess);
end;

тему можно закрывать.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:08.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter