API чтение значений из списка - страница 2

 
Zhunko:
Есть класс у меня для работы с контролами из любого процесса. Если хочешь, пришлю.

Вадим ! да конечно... спасибо

yzh СОБАКА mail.ru

 
Новостную ленту так можно считать? Идентификатор SusListView для GetDlgItem(h, ? ) новостной ленты подскажите пожалуйста
 
GSB:
Новостную ленту так можно считать? Идентификатор SusListView для GetDlgItem(h, ? ) новостной ленты подскажите пожалуйста

можно - но вот тут правильней зачитывать с сайта новостного
 
Код:


Procedure FindIDel(NameExe :String);
var hTaskManager, hListView: HWND;
  vItemCount: Integer; // кол-во пунктов в списке 
  i: Integer;
  vBuffer: array[0..255] of Char; // буфер для приема данных
  vProcessId: DWORD; // идентификатор потока, который создал наш ListView
  vProcess: THandle; // дескриптор для работы с процессом
  vPointer: Pointer; // указатель на область выделенной памяти в чужом процессе
  vNumberOfBytesRead: Cardinal;
  vItem: TLVItem;
  St: String;
begin
 IF NameExe='' Then Exit;
  hTaskManager := FindWindow('#32770', 'Диспетчер задач Windows'); // сам диспетчер задач
 if hTaskManager = 0 then exit; // выход, если диспетчер не найден
  hListView := FindWindowEx(hTaskManager, 0, '#32770', ''); // первый список (приложения)
  hListView := FindWindowEx(hListView, 0, 'SysListView32', nil); // наш список (процессы)
  vItemCount := SendMessage(hListView, LVM_GETITEMCOUNT, 0, 0); // получаем кол-во пунктов в ListView
                          { Получаем идентификатор потока, который создал ListView }
  GetWindowThreadProcessId(hListView, @vProcessId);
{ открываем процесс связанный с vProcessId с правами записи/чтения памяти } 
  vProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE,
                        False, vProcessId);
{ выделяем память в адресном пространстве этого процесса }
  vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT,
                           PAGE_READWRITE);
  try
for I := 0 to vItemCount - 1 do
begin // перебираем все записи
 with vItem do
 begin
  mask := LVIF_TEXT; // запрашиваем текст
  iItem := I;
  iSubItem := 0; // мы получаем данные первого столбца (!!!)
  cchTextMax := SizeOf(vBuffer);
  pszText := Pointer(Cardinal(vPointer) + SizeOf(TLVItem)); // куда будет помешен результат
 end;
  WriteProcessMemory(vProcess, vPointer, @vItem, SizeOf(TLVItem),
                     vNumberOfBytesRead);
  SendMessage(hListView, LVM_GETITEM, I, lparam(vPointer));
{ считываем результат } 
  ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),
                    @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);

  St := vBuffer;
{ здесь определяем, что удалять (имя нашего .exe файла) }
 if St = NameExe{ExtractFileName(Application.ExeName)} then
 SendMessage(hListView, LVM_DELETEITEM, i, 0);
end; { - for - }
  finally
   VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE); // освобождаем память
   CloseHandle(vProcess) // закрываем дескриптор доступа к процессу
  end { - try - }
end;

http://www.programmersforum.ru/showpost.php?p=87872&postcount=9
 
http://www.delphisources.ru/forum/showthread.php?t=7627&page=2



rocedure TForm1.GetListViewData(LVHandle: HWND; ColumnCount: Integer;
                                 var DataGrid: TStringGrid);
var
  hProcess: THandle;
  dwProcessID: DWORD;
  dwBytesWriten: DWORD;
  nItemCount: Integer;
  i, j, nTextLength: Integer;
  plviRemoteLVItem: PLVItem;
  lviRemoteLVItem: LV_ITEM;
  pszText: PChar;
  svText: ShortString;
begin
  if LVHandle = 0 then Exit;
  dwProcessID := 0;
  nItemCount := ListView_GetItemCount(LVHandle);
  GetWindowThreadProcessId(LVHandle, @dwProcessID);
  if dwProcessID = 0 then Exit;
  hProcess := OpenProcess(PROCESS_ALL_ACCESS, True, dwProcessID);
  if hProcess = 0 then Exit;
  pszText := VirtualAllocEx(hProcess, nil, 255,
                            MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
  if GetLastError <> 0 then Exit;
  plviRemoteLVItem := VirtualAllocEx(hProcess, nil, SizeOf(LV_ITEM),
                                     MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
  if GetLastError <> 0 then Exit;
 
  <font color="RoyalBlue"><i>{ единицу прибавляю в том предположении,
    что есть фиксированные строка и столбец }</i></font>
  DataGrid.RowCount := nItemCount + 1;
  DataGrid.ColCount := ColumnCount + 1;
 
  ZeroMemory(@lviRemoteLVItem, SizeOf(LV_ITEM));
  lviRemoteLVItem.mask := LVIF_TEXT;
  lviRemoteLVItem.pszText := pszText;
  lviRemoteLVItem.cchTextMax := 255;
 
  for i := 0 to nItemCount - 1 do
  begin
    lviRemoteLVItem.iSubItem := 0;
    if not WriteProcessMemory(hProcess, plviRemoteLVItem, @lviRemoteLVItem,
                 SizeOf(LV_ITEM), dwBytesWriten) then Exit;
    nTextLength := SendMessage(LVHandle, LVM_GETITEMTEXT,
                               i, Integer(plviRemoteLVItem));
    ZeroMemory(@svText, 255);
    ReadProcessMemory(hProcess, lviRemoteLVItem.pszText,
                      @svText[1], nTextLength, dwBytesWriten);
    DataGrid.Cells[1, i + 1] := StrPas(PChar(@svText[1]));
    for j := 1 to ColumnCount - 1 do
    begin
      lviRemoteLVItem.iSubItem := j;
      if not WriteProcessMemory(hProcess, plviRemoteLVItem, @lviRemoteLVItem,
                                SizeOf(LV_ITEM), dwBytesWriten) then Exit;
      nTextLength := SendMessage(LVHandle, LVM_GETITEMTEXT,
                                 i, Integer(plviRemoteLVItem));
      ZeroMemory(@svText, 255);
      ReadProcessMemory(hProcess, lviRemoteLVItem.pszText,
                        @svText[1], nTextLength, dwBytesWriten);
      DataGrid.Cells[j + 1, i + 1] := StrPas(PChar(@svText[1]));
    end;
  end;
  VirtualFreeEx(hProcess, pszText, 0, MEM_RELEASE);
  VirtualFreeEx(hProcess, plviRemoteLVItem, 0, MEM_RELEASE);
  CloseHandle(hProcess);
end;