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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.07.2011, 20:29   #1
Ghennadiy
Форумчанин
 
Регистрация: 21.08.2009
Сообщений: 153
Сообщение syslistview32

Нужно прочитать syslistview32 в чужом приложении
и записать в свой listbox

Спасибо
Ghennadiy вне форума Ответить с цитированием
Старый 24.07.2011, 23:31   #2
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Пример считывания с чужого листа 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;

Последний раз редактировалось Aliens_wolfs; 24.07.2011 в 23:36.
Aliens_wolfs вне форума Ответить с цитированием
Старый 25.07.2011, 12:18   #3
Ghennadiy
Форумчанин
 
Регистрация: 21.08.2009
Сообщений: 153
Сообщение

о спасибо за такой хороший ответ! а можно не писать в память чужого процесса с которого читаешь - прочто читать ее?
Ghennadiy вне форума Ответить с цитированием
Старый 25.07.2011, 12:53   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

не выйдет без записи.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.07.2011, 15:23   #5
Ghennadiy
Форумчанин
 
Регистрация: 21.08.2009
Сообщений: 153
По умолчанию

а если так:
Код:
function LV_GetItemText(hwndLV:HWND; iItem, iSubItem:integer):string;
    var
     lvitem:LV_ITEM;
    begin
     SetLength(Result,MAX_PATH);
     ZeroMemory(@lvitem,sizeof(LV_ITEM));
     lvitem.mask:= LVIF_TEXT;
     lvitem.iSubItem:=iSubItem;
     lvitem.pszText:=@Result[1];
     lvitem.cchTextMax:=MAX_PATH-1;
     lvitem.cchTextMax:=SendMessage(hwndLV,LVM_GETITEMTEXT,iItem,LPARAM(@lvitem)); // длина строки
     if lvitem.cchTextMax>0 then
     begin
      SetLength(Result,lvitem.cchTextMax+1);
      inc(lvitem.cchTextMax);
      SendMessage(hwndLV,LVM_GETITEMTEXT,iItem,LPARAM(@lvitem))
     end else Result:=''
    end;
Ghennadiy вне форума Ответить с цитированием
Старый 27.07.2011, 15:34   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

адрес должен быть в чужом процессе, а не в вашем.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.07.2011, 16:58   #7
Ghennadiy
Форумчанин
 
Регистрация: 21.08.2009
Сообщений: 153
По умолчанию

[Error] Unit1.pas(16): Unsatisfied forward or external declaration: 'TForm1.GetListViewGrid
на процедуру Aliens_wolfs, почему?
Ghennadiy вне форума Ответить с цитированием
Старый 29.07.2011, 17:14   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вообще то там описана рядовая процедура, а не метод класса.(а вы обьявили как метод)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.07.2011, 17:38   #9
Ghennadiy
Форумчанин
 
Регистрация: 21.08.2009
Сообщений: 153
Сообщение

вроде все получилось но запутался с вызовом самой функции
исходник тут http://zalil.ru/31484231
Ghennadiy вне форума Ответить с цитированием
Старый 24.04.2012, 15:06   #10
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

а разве нельзя просто использовать SendMessage + стандартные сообщения syslistview32, описанные в MSDN ?
Или макрос "listview_getitemtext"?
я пишу подобную программу и мне тоже интересно.
BLACK_RAIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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