|
Вопрос # 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 (статус: Посетитель)
Вопрос отправлен: 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™ (статус: Доктор наук), 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 (статус: Посетитель), 23 мая 2010, 14:19 [#2]:
Да просто я заинтересовался этим а он мне под руку попался - учусь все а выбираю блин все по сложней.А вообще логика то правильная?А с memo какое сообщение работает? Я скачал справочник а там чего то все так не полно описано.За ответ спасибо.
|
|
igoriy (статус: Посетитель), 23 мая 2010, 14:33 [#3]:
А все таки как получить из listview то?
|
|
min@y™ (статус: Доктор наук), 23 мая 2010, 14:35 [#4]:
Цитата (igoriy):
А вообще логика то правильная?
Не знаю, я такой порнухой не занимался.
Цитата (igoriy):
А с memo какое сообщение работает?
WM_GETTEXTLENGTH и WM_GETTEXT.
Цитата (igoriy):
Я скачал справочник а там чего то все так не полно описано.
Что за справочник такой? Где скачать?
Цитата (igoriy):
За ответ спасибо.
"Спасибо" - это много. Достаточно пива.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 23 мая 2010, 14:36 [#5]:
Цитата (igoriy):
А все таки как получить из listview то?
Скажи сначала, для чего тебе это нужно.
Бесплатный совет: проблемы надо решать по мере их возникновения и не создавать их самому себе.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
igoriy (статус: Посетитель), 23 мая 2010, 14:45 [#6]:
В принципе мне это не нужно.Но хочется научиться.Вдруг пригодиться.Вот с Listbox получается а вот с Listview нет-теперь спать не буду.Далее про справочник- таких в нете много-без автора просто"справочник WinAPI" на русском языке так как мой английский оставляет желать лучшего а учить его позновато для меня.А почему порнухой?Просто мне пока все интересно - ведь это не моя работа а так сказать хобби.И насчет последнего совета - родился я в такой стране где сначало создавали трудности а потом с ними боролись-страны уже нет.
|
|
igoriy (статус: Посетитель), 23 мая 2010, 14:49 [#7]:
А как таки как получить из listview ?Не сознаешься?
|
|
min@y™ (статус: Доктор наук), 23 мая 2010, 15:00 [#8]:
Цитата (igoriy):
А как таки как получить из listview ?Не сознаешься?
Я ж говорю, я такой порнухой не занимался, т.к. не было повода дёргать данные из чужих listview.
Для этого секса предназначены сообщения LVM_*. Начни с LVM_GETITEMCOUNT, а дальше читай хэлп.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Вадим К (статус: Академик), 23 мая 2010, 15:18 [#9]:
А дальше будут приключения по круче. когда то вытягивал текст с ListView одной проги. Дело в том, что там просто строку с него забрать нельзя. Нужно использовать хитрые функции. В целом получается так - выделяем в подопытном процессе кусочек памяти, отсылаем сообщение получить текст. Оно сохраняется в программе, а потом уже вычитываем с подопытного процесса данные с памяти. Чудеса невероятные
Галочка "подтверждения прочтения" - вселенское зло.
|
|
igoriy (статус: Посетитель), 23 мая 2010, 15:28 [#10]:
ого го. Вот так я залез.Вот так у меня всегда.А нельзя небольшой примерчик в коде - может смогу разобраться.?
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|