Изменение SysListView32 в другом приложении

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Lobster
Сообщения: 2
Зарегистрирован: 16 окт 2007, 01:03

Дан хэндл списка в некотором приложении.
Необходимо добавить в этот список строчки с определёнными значениями.
Причём список этот типа SysListView32.

Вот кусок кода на Delphi:

Код: Выделить всё

procedure AddSomeString(AHandle:THandle);
var
vItem: TLVItem;
vPointer,vPointerText:Pointer;
vProcessId: DWORD;
vProcess: THandle;
vBuffer: array[0..255] of Char;
begin
  GetWindowThreadProcessId(AHandle, @vProcessId);
  vProcess := OpenProcess(PROCESS_ALL_ACCESS, False, vProcessId);
  vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
  vPointerText := VirtualAllocEx(vProcess, nil,4096,MEM_RESERVE or MEM_COMMIT,PAGE_READWRITE);
    vBuffer:='someText';
    with vItem do begin
      mask := HDI_TEXT;
      iItem := 0;
      iSubItem := 0;
      cchTextMax := SizeOf(vBuffer);
      pszText := (vPointerText);
    end;
    WriteProcessMemory(vProcess, vPointer, @vItem, SizeOf(TLVItem), nil);
    WriteProcessMemory(vProcess, vPointerText, @vBuffer, SizeOf(vBuffer), nil);
    SendMessage(AHandle, LVM_INSERTITEM, 0, lparam(vPointer));
end;
Этот код добавляет пустую строку в список.
Каким образом можно заполнить ячейки этой строки "нужным" текстом ?
Lobster
Сообщения: 2
Зарегистрирован: 16 окт 2007, 01:03

Проблема частично устранена, теперь после записи в память "чужой" программы данные можно считать, но в самой программе эти данные не отображаются.

Код: Выделить всё

procedure AddSomeString(AHandle:THandle);
var
vItem: TLVItem;
vPointer,vPointerText:Pointer;
vProcessId: DWORD;
vProcess: THandle;
vBuffer: array[0..255] of Char;
begin
  GetWindowThreadProcessId(AHandle, @vProcessId);
  vProcess := OpenProcess(PROCESS_ALL_ACCESS, False, vProcessId);
  vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
  vBuffer:='999999999';
    with vItem do begin
      mask := HDI_TEXT;
      iItem := 0;
      iSubItem := 0;
      cchTextMax := SizeOf(vBuffer);
      pszText := VirtualAllocEx(vProcess, nil,256,MEM_RESERVE or MEM_COMMIT,PAGE_READWRITE);
      pchar(pszText):=vBuffer;
    end;
    WriteProcessMemory(vProcess, vPointer, @vItem, SizeOf(TLVItem), vNumberOfBytesRead);
    SendMessage(AHandle, LVM_INSERTITEM, 0, lparam(vPointer));
    ReadProcessMemory(vProcess, vPointer, @vItem, SizeOf(TLVItem), vNumberOfBytesRead);
    ShowMessage(vItem.pszText);
end;
Естественно, каким образом сделать так, чтобы в "чужой" программе были видны изменения списка ?
Ответить