Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 210

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Научите пожалуйста как можно скопировать содержимое Listview чужого приложения в своё приложение.Пытаюсь делать так:
var
h:Hwnd;
i,k:integer;
buffer:array [0..20] of char;
begin
h:=FindWindow(nil,'Диспетчер задач Windows');
h:=FindWindowEx(h,0,'#32770',nil);
h:=FindWindowEx(h,0,'SysListView32',nil);
i:=SendMessage(h,LB_GETCOUNT,0,0);
for k:=0 to i-1 do begin
SendMessage(h,LB_GETTEXT,k,integer(@buffer));
with ListView1.Items.Add do
begin
SubItems.Add(string(buffer));
end;
end
end;
но i получается равно нулю.Умом понимаю что то не то у меня с логикой но сделать ни чего не могу(кажется мне что с listview как то по другому надо)

igoriy Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: igoriy (статус: Посетитель)
Вопрос отправлен: 23 мая 2010, 13:59
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Паровоз

Здравствуйте, igoriy!

var
  wnd: HWND;
  cnt: Integer;
  dwProcessId: Cardinal;
  hProcess: Cardinal;
  ptr: Pointer;
  i: Integer;
  Item: TLVItem;
  Buffer: array[0..255] of Char; // буфер для према данных
  st: string;
  lpNumberOfBytesRW: Cardinal;
begin
  wnd := FindWindow('#32770', 'Диспетчер задач Windows');
  if wnd = 0 then exit;
  wnd := FindWindowEx(wnd, 0, '#32770', '');
  wnd := FindWindowEx(wnd, 0, 'SysListView32', nil);
  cnt := SendMessage(wnd, LVM_GETITEMCOUNT, 0, 0); // количество пунктов в ListView
 
  { получаем идентификатор процесса, который создал ListView }
  GetWindowThreadProcessId(wnd, dwProcessId);
  hProcess := OpenProcess(
      PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE,
      False, dwProcessId);
  { выделяем память в адресном простанстве этого процесса }
  ptr := VirtualAllocEx(hProcess, nil, 4096,
    MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
  try
    for i := 0 to cnt-1 do
    begin
      with Item do
      begin
        mask := LVIF_TEXT;
        iItem := i;
        iSubItem := 0; 
        cchTextMax := SizeOf(Buffer);
        pszText := Pointer(Cardinal(ptr) + SizeOf(TLVItem)); 
      end;
      WriteProcessMemory(hProcess, ptr, @Item, SizeOf(TLVItem), lpNumberOfBytesRW);
      SendMessage(wnd, LVM_GETITEM, i, lparam(ptr));
      { считываем результат }
      ReadProcessMemory(hProcess, Pointer(Cardinal(ptr) + SizeOf(TLVItem)), @Buffer[0], SizeOf(Buffer),
lpNumberOfBytesRW);
      st := Buffer;
      Memo1.Lines.Add(st);//помещаем прочитанную строку в Memo
    end; { - for - }
  finally
    VirtualFreeEx(hProcess, ptr, 0, MEM_RELEASE); 
    CloseHandle(hProcess);
  end; { - try - }
end;

Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 23 мая 2010, 23:53


Мини-форум вопроса

Всего сообщений: 11; последнее сообщение — 23 мая 2010, 17:46; участников в обсуждении: 4.
min@y™

min@y™ (статус: Доктор наук), 23 мая 2010, 14:11 [#1]:

Сообщения типа LB_* предназначены для LISTBOX, а не для LISTVIEW.

Цитата:


An application sends an LB_GETCOUNT message to retrieve the number of items in a list box.

LB_GETCOUNT  
wParam = 0; // not used; must be zero  
lParam = 0; // not used; must be zero

Parameters

This message has no parameters.

Return Values

The return value is the number of items in the list box, or LB_ERR if an error occurs.

Remarks

The returned count is one greater than the index value of the last item (the index is zero-based).


Вопрос: что у тебя должна делать твоя программа? Зачем тебе список процессов вытаскивать из таскменеджера?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
igoriy

igoriy (статус: Посетитель), 23 мая 2010, 14:19 [#2]:

Да просто я заинтересовался этим а он мне под руку попался - учусь все а выбираю блин все по сложней.А вообще логика то правильная?А с memo какое сообщение работает? Я скачал справочник а там чего то все так не полно описано.За ответ спасибо.
igoriy

igoriy (статус: Посетитель), 23 мая 2010, 14:33 [#3]:

А все таки как получить из listview то?
min@y™

min@y™ (статус: Доктор наук), 23 мая 2010, 14:35 [#4]:

Цитата (igoriy):

А вообще логика то правильная?

Не знаю, я такой порнухой не занимался.

Цитата (igoriy):

А с memo какое сообщение работает?

WM_GETTEXTLENGTH и WM_GETTEXT.

Цитата (igoriy):

Я скачал справочник а там чего то все так не полно описано.

Что за справочник такой? Где скачать?

Цитата (igoriy):

За ответ спасибо.

"Спасибо" - это много. Достаточно пива. :)
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 23 мая 2010, 14:36 [#5]:

Цитата (igoriy):

А все таки как получить из listview то?

Скажи сначала, для чего тебе это нужно.
Бесплатный совет: проблемы надо решать по мере их возникновения и не создавать их самому себе.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
igoriy

igoriy (статус: Посетитель), 23 мая 2010, 14:45 [#6]:

В принципе мне это не нужно.Но хочется научиться.Вдруг пригодиться.Вот с Listbox получается а вот с Listview нет-теперь спать не буду.Далее про справочник- таких в нете много-без автора просто"справочник WinAPI" на русском языке так как мой английский оставляет желать лучшего а учить его позновато для меня.А почему порнухой?Просто мне пока все интересно - ведь это не моя работа а так сказать хобби.И насчет последнего совета - родился я в такой стране где сначало создавали трудности а потом с ними боролись-страны уже нет.
igoriy

igoriy (статус: Посетитель), 23 мая 2010, 14:49 [#7]:

А как таки как получить из listview ?Не сознаешься?
min@y™

min@y™ (статус: Доктор наук), 23 мая 2010, 15:00 [#8]:

Цитата (igoriy):

А как таки как получить из listview ?Не сознаешься?

Я ж говорю, я такой порнухой не занимался, т.к. не было повода дёргать данные из чужих listview.
Для этого секса предназначены сообщения LVM_*. Начни с LVM_GETITEMCOUNT, а дальше читай хэлп.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 23 мая 2010, 15:18 [#9]:

А дальше будут приключения по круче. когда то вытягивал текст с ListView одной проги. Дело в том, что там просто строку с него забрать нельзя. Нужно использовать хитрые функции. В целом получается так - выделяем в подопытном процессе кусочек памяти, отсылаем сообщение получить текст. Оно сохраняется в программе, а потом уже вычитываем с подопытного процесса данные с памяти. Чудеса невероятные:)
Галочка "подтверждения прочтения" - вселенское зло.
igoriy

igoriy (статус: Посетитель), 23 мая 2010, 15:28 [#10]:

ого го. Вот так я залез.Вот так у меня всегда.А нельзя небольшой примерчик в коде - может смогу разобраться.?
SOA

SOA (статус: Посетитель), 23 мая 2010, 17:46 [#11]:

Вот тут http://msdn.microsoft.com/en-us/library/bb774737(VS.85).aspx расположены апишки для listview, в вашем случае я думаю может быть полезна функция ListView_GetEmptyText
ListView_GetItemCount
ListView_GetItemText.
Если англицкого не знаешь всегда есть Google переводчик.
8)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:30
Выполнено за 0.04 сек.