Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2013, 22:37   #11
alf2006x
Новичок
Джуниор
 
Регистрация: 21.06.2010
Сообщений: 2
По умолчанию 2 Пепел Феникса

День добрый.
Очень нужен совет.

Пытаюсь прочитать SysListView32 чужого приложения.
Некоторые SysListView32 этого приложения - читаются нормально (при помощи записи-чтения по адресам чужого приложения из Вашего примера), а какие-то не читаются вообще (есть наблюдение что не читаются те, у которых предусмотрена сортировка по колонкам). Перерыл все форумы - решения по чтению полей SysListView32 везде практически одинаковые, перепробовал все, но ни одно решение не помогает прочитать в моём случае.

Подскажите куда мне рыть? Как определить что за ячейки в моём "нечитаемом" SysListView32? Может быть там картинки (думаю что очень маловероятно) или ещё какие-то объекты? Как это определить?
alf2006x вне форума Ответить с цитированием
Старый 24.06.2013, 16:52   #12
BarsDG
Пользователь
 
Регистрация: 06.09.2010
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Aliens_wolfs Посмотреть сообщение
Пример считывания с чужого листа ListView или syslistview32 в свой TStringGrid, можешь и под listbox сделать все в ваших руках.
Я даже рабочий стол считал этой функцией
1. К проекту добавить юнит:
uses
CommCtrl;

2. Вставь в форму TStringGrid

3. Перенести этот код к себе в проект
Код:

Код:
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_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[1, i + 1] := 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;

4. Использовать так:
ALVHandle: это дескриптор листа которого нужно захватить syslistview32
AColumnCount: количество столбцов
AItemCount: количество строк если поставить значение 0 то прочитает все строки.
ADataGrid: это твой грид на твоей форме в котором будут отображаться строки с чужого ListView.
Код:

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
GetListViewGridData(ALVHandle, 10, 0, StringGrid1);
end;
Вы не пробовали использовать вашу процедуру в Delphi версии XE, у меня не работает
BarsDG вне форума Ответить с цитированием
Старый 25.06.2013, 12:37   #13
BarsDG
Пользователь
 
Регистрация: 06.09.2010
Сообщений: 47
По умолчанию

Вопрос решен!
BarsDG вне форума Ответить с цитированием
Старый 15.03.2014, 08:27   #14
ProtonFox
 
Регистрация: 12.11.2012
Сообщений: 7
По умолчанию

В версиях XE нужно ставить параметр dwWriten: SIZE_T;
У меня вопрос: читаю этим кодом таблицу слов, копирую её в StringGrid, в итоге получаю лишь половины слов. В чём дело, почему слова не целые?

Для ознакомления с моей таблицей (которую я перехватываю) выкладываю код:
Код:
procedure TForm1.FormCreate(Sender: TObject);

const
  Names: array[0..5, 0..1] of string = (
    ('Rubble', 'Barney'),
    ('Michael', 'Johnson'),
    ('Bunny', 'Bugs'),
    ('Silver', 'HiHo'),
    ('Simpson', 'Bart'),
    ('Squirrel', 'Rocky')
    );

var
  I: Integer;
  NewColumn: TListColumn;
  ListItem: TListItem;
  ListView: TListView;
begin
  ListView := TListView.Create(Self);
  with ListView do
  begin
    Parent := Self;
    Align := alClient;

    ViewStyle := vsReport;

    NewColumn := Columns.Add;
    NewColumn.Caption := 'Last';
    NewColumn := Columns.Add;
    NewColumn.Caption := 'First';

    for I := Low(Names) to High(Names) do
    begin
      ListItem := Items.Add;
      ListItem.Caption := Names[I][0];
      ListItem.SubItems.Add(Names[I][1]);
    end;
  end;
end;

Последний раз редактировалось ProtonFox; 15.03.2014 в 23:34. Причина: Отсутствие ответа на мой вопрос.
ProtonFox вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SysListView32 Добавление Item (чужой процесс) custanator Win Api 10 06.04.2011 14:30
Чужой SysListView32 W0LF Win Api 1 24.02.2010 17:19
Изменение SysListView32 в другом приложении Legos Общие вопросы Delphi 1 16.10.2007 02:29