Сейчас на форуме: Rio, YDS (+10 невидимых)

 eXeL@B —› Основной форум —› Техника и утилиты захвата данных из списков
Посл.ответ Сообщение


Ранг: 327.3 (мудрец)
Активность: 0.250
Статус: Участник

Создано: 11 декабря 2005 20:07 · Поправил: bloom
· Личное сообщение · #1

Часто приходится извлекать данные из списков программ (будь то
телефонный справочник или что-нибудь другое)
чаще всего - это ListBox или SysListView32
в этом случае очень помогает утилита List Grabber 1.0
http://alex-home-pg.nm .ru/List_Grabber.rar http://alex-home-pg.nm.ru/List_Grabber.rar

также иногда использую SysExporter (знает больше классов)
http://www.nirsoft.net/ut ils/sysexp.zip http://www.nirsoft.net/utils/sysexp.zip

однако иногда попадаются экзотические классы окон
например KAVGUI_ListCtrl в 5-м Касперском
как извлечь данные из такого списка ?? куда копать ?




-----
in search of sunrise





Ранг: 327.3 (мудрец)
Активность: 0.250
Статус: Участник

Создано: 11 декабря 2005 20:21
· Личное сообщение · #2

например отсюда

4976_untitled.GIF.zip

-----
in search of sunrise





Ранг: 230.5 (наставник)
Активность: 0.180
Статус: Участник
Norg

Создано: 11 декабря 2005 20:38
· Личное сообщение · #3

Еще есть клептомания h**p://structurise.com/kleptoru.exe Захватывает текст хоть откуда

-----
M&#225 enginn renna undan &#254v&#237 sem honum er skapa&#240





Ранг: 327.3 (мудрец)
Активность: 0.250
Статус: Участник

Создано: 11 декабря 2005 23:28
· Личное сообщение · #4

да и есть ScreenShot Reader в 8-м ФайнРидере,
Клептомания не совсем выдирает данные из окна со скроллингом, вобщем снятим и распознаванием скриншотов хотелось бы заниматься в последнюю очередь...

ведь можно как-то программно выдрать данные из этого окна ?

http:/./imageshack.us

-----
in search of sunrise





Ранг: 84.8 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 12 декабря 2005 05:34
· Личное сообщение · #5

bloom пишет:
ведь можно как-то программно выдрать данные из этого окна ?


Конечно можно. Только хэндл этого листбокса определи - hList1.

GetItem proc RowWORD, ColumnWORD, pszCaptionWORD
LOCAL lvc:LV_ITEM
mov lvc.imask, LVIF_TEXT
push Row
pop lvc.iItem
push Column
pop lvc.iSubItem
push pszCaption
pop lvc.pszText
invoke SendMessage, hList1, LVM_GETITEM,0, addr lvc
ret
GetItem endp

Row - ряд. Column - колонка.
В pszCaption помещается полученный результат.



Ранг: 138.7 (ветеран), 135thx
Активность: 0.110
Статус: Участник

Создано: 12 декабря 2005 10:32 · Поправил: crc1
· Личное сообщение · #6

Я пользуюсь прогой Snagit7
Выдирает текст из любых окошек со скролом и выгружает в файло .txt с разделителями,
также можно в ексель, ворд и т.д
http://www.techsmith.com/download/snagitdefault.asp http://www.techsmith.com/download/snagitdefault.asp




Ранг: 271.6 (наставник), 2thx
Активность: 0.30
Статус: Участник

Создано: 12 декабря 2005 11:21
· Личное сообщение · #7

Есть хорошая прога: Inq Soft Windows Scanner, где непомню, помню что она тоже может выдирать с окон ресурсы

-----
iNTERNATiONAL CoDE CReW





Ранг: 230.5 (наставник)
Активность: 0.180
Статус: Участник
Norg

Создано: 12 декабря 2005 12:37
· Личное сообщение · #8

Spirit пишет:
Есть хорошая прога: Inq Soft Windows Scanner, где непомню, помню что она тоже может выдирать с окон ресурсы
http://kickme.to/inqsoft Кстати обновился InqSoft Sign 0f Misery. Neo Sign 0f Misery Качать тут s0m.narod.ru/neos0m.zip

-----
M&#225 enginn renna undan &#254v&#237 sem honum er skapa&#240





Ранг: 271.6 (наставник), 2thx
Активность: 0.30
Статус: Участник

Создано: 12 декабря 2005 14:49
· Личное сообщение · #9

di-2 пишет:
обновился InqSoft Sign 0f Misery

Лучше скажи что там хорошего, а то качать в лом.

-----
iNTERNATiONAL CoDE CReW




Ранг: 4.0 (гость)
Активность: 0.010
Статус: Участник

Создано: 12 декабря 2005 21:26
· Личное сообщение · #10

в книге "Программирование в Win32API на Visual Basic" неплохо осуждаются темы связанные с вытаскивание текста из котролов...
ее можно скачать в электронном варианте и с прилагаемыми исходниками на www.dmkpress.ru




Ранг: 327.3 (мудрец)
Активность: 0.250
Статус: Участник

Создано: 12 декабря 2005 23:10
· Личное сообщение · #11

да, все классные утилиты - всеми пользуюсь, но ни с одной не получилось красиво выдрать ресурсы из окна Касперского (это просто пример, не получается выдрать из многих окон),
например SnagIt плохо подходит для больших списком - так как AutoScroll при захвате там чрезвычайно медленный (даже не предаставляю сколько он будет выдирать данные из этого окна, если учесть сколько записей в базе касперского)
Window Scanner умеет выдирать только из 4-х стандартных контролов, к этому примеру не подходит...

пробую делать по совету TOG, код такой
var
wnd: HWND; //Handle ListView.
lvi: LV_ITEM;
id: Integer;

begin

GetMem(lvi.pszText, 255);
lvi.mask:=LVIF_TEXT;
lvi.iItem:=0;
lvi.iSubItem:=0;
lvi.cchTextMax:=255;
id:=GetDlgCtrlID(wnd);
SendMessage(id, LVM_GETITEM, 0, LPARAM(@lvi));
ShowMessage(StrPas(lvi.pszText));
FreeMem(lvi.pszText,SizeOf(lvi.pszText^));
end;


так вот, этот код работает прекрасно в моем окне, но не работает в чужих окнах. как же найти значение в ListView в чужом окне ?

-----
in search of sunrise





Ранг: 327.3 (мудрец)
Активность: 0.250
Статус: Участник

Создано: 12 декабря 2005 23:11 · Поправил: bloom
· Личное сообщение · #12

SaTaN
а где ее скачать-то ? по тому адресу просто интернет-магазин..

-----
in search of sunrise





Ранг: 230.5 (наставник)
Активность: 0.180
Статус: Участник
Norg

Создано: 12 декабря 2005 23:51
· Личное сообщение · #13

Spirit пишет:
Лучше скажи что там хорошего, а то качать в лом.
InqSoft Neo Sign 0f Misery представляет собой средство автоматизации, основанное на использовании сценариев (скриптов), описывающих последовательность действий, которые необходимо выполнить для решения той или иной задачи. Данный продукт разрабатывался как замена Sign 0f Misery - предыдущего проекта аналогичного назначения, который обладал некоторыми существенными ограничениями, необходимость преодоления которых и стала причиной появления этого проекта. InqSoft Neo Sign 0f Misery позволяет решать повседневные задачи рядового пользователя: запуск определенных программ при некоторых условиях, открытие документов, автоматический вызов тех или иных пунктов меню программы, управление состоянием и расположением окон на экране. Кроме того, программа позволяет выполнять достаточно сложные операции по отслеживанию и эмуляции нажатий на клавиши, имитировать работу с мышью, управлять приоритетами программ, модифицировать содержимое файлов, править код программ непосредственно в памяти и выполнять прочие подобные операции. Большое внимание при разработке Neo Sign 0f Misery уделено возможностям разблокирования неактивных управляющих элементов: кнопок, переключателей, элементов меню и т.п., а также принудительной активации заблокированных функций в программах.



Язык сценариев, который использует Neo Sign 0f Misery, позволяет строить скрипты с достаточно сложной логикой, использующие конструкции ветвления, типизированные переменные и другие конструкции, обычно присущие языкам программирования. Скрипты могут компилироваться либо в байт-код, исполняемый ядром в виде DLL (что позволяет интегрировать возможности Neo Sign 0f Misery в собственные программы), либо в исполняемый файл, содержащий в себе все необходимое для работы скрипта (т.е. передавать пользователю один только EXE-файл, не требующий наличия на компьютере Neo Sign 0f Misery). Ядро Neo Sign 0f Misery имеет сравнительно небольшой размер (порядка десятков килобайт) и потребляет минимальное количество ресурсов при высокой скорости исполнения скриптов. Это позволяет использовать Neo Sign 0f Misery для создания небольших приложений, позволяющих эффективно управлять процессами, протекающими в компьютере, даже при минимальных навыках в программировании и знаниях об устройстве операционной системы.



Neo Sign 0f Misery является полностью модульным продуктом, основными модулями которого являются:



· Ядро в виде DLL и образа исполняемого файла, обеспечивающее работу интерпретатора байт-кода

· Компилятор, позволяющий преобразовывать текстовые файлы со сценариями в байт-код или исполняемый файл

· Оболочка, связывающая воедино редактор сценариев с подсветкой синтаксиса и компилятор, а также позволяющая выполнять тестовый запуск откомпилированных скриптов

· Документация по синтаксису языка сценариев Neo Sign 0f Misery и назначению команд, доступных для использования в сценариях



Исходные тексты программных модулей проекта на Delphi являются открытыми и распространяются по лицензии GPL.
И там теперь не кнопочки кидаешь,а пишешь скриптовым языком Вот пример
; Скрипт-шутка. Имитирует "ветер", сдувающий курсор мыши к правой
; границе экрана. Клавиша CONTROL завершает работу скрипта.
;
; CyberManiac, 01.11.2005

galloc 1 .

^loop
mouse_get_pos 0 .
add 0 1 .
mouse_set_pos @0 .
sleep 1
is_keys_pressed 0 $11 .
branch 0 0 ^loop .

mbox 'Работа скрипта завершена' .
eos $

-----
M&#225 enginn renna undan &#254v&#237 sem honum er skapa&#240




Ранг: 65.7 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 13 декабря 2005 02:26
· Личное сообщение · #14

bloom
Возможно использовать GetDlgItem вместо GetDlgCtrlID и полученный хендел уже в sendmessage....



Ранг: 32.4 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 13 декабря 2005 06:58
· Личное сообщение · #15

в таких случаях когда в качестве параметра SendMessage нужно передать указатель на что-либо мы должны выделять память под данный объект (на который делаем указатель) в памяти того процесса в котором находиться окно, которому мы посылаем сообщение через SendMessage

Этим объясняется
bloom пишет:
так вот, этот код работает прекрасно в моем окне, но не работает в чужих окнах


Вот мой пример (проверенный) который получает тултипы всех кнопок в Трее
[C++]

HWND myTray = FindWindowEx(FindWindowEx(FindWindowEx(FindWindow("Shell_TrayWnd", NULL),NULL,"TrayNotifyWnd",NULL),NULL,"SysPager",NULL),NULL,"ToolbarWi ndow32",NULL);
LRESULT tTotal = SendMessage(myTray,TB_BUTTONCOUNT,0,0);
cout << "Total items in tray -> " << tTotal << endl;

TBBUTTON1 tbb;
char text[100];

DWORD pid;
HANDLE hProc;
GetWindowThreadProcessId(myTray, &pid);
hProc = OpenProcess(PROCESS_VM_READ | PROCESS_VM_OPERATION, false, pid);
//info
LPVOID addr = VirtualAllocEx(hProc, &tbb, sizeof(tbb), MEM_COMMIT, PAGE_READWRITE);
//text
LPVOID addr_text = VirtualAllocEx(hProc, &text, sizeof(text), MEM_COMMIT, PAGE_READWRITE);

for(int i=0;i < tTotal; i++)
{
SIZE_T count;

cout << "item (" << i+1 << " / " << tTotal << "):" << endl;

LRESULT lLen = SendMessage(myTray,TB_GETBUTTONTEXT,(WPARAM)i,(LPARAM) addr_text);
if(lLen==-1)
cout << "error!!!" << endl;

ReadProcessMemory(hProc, addr_text, &text, sizeof(text), &count);

LRESULT lResult = SendMessage(myTray,TB_GETBUTTON,(WPARAM) i,(LPARAM) (LPTBBUTTON) addr);
if(lResult==FALSE)
cout << "error!!!" << endl;

ReadProcessMemory(hProc, addr, &tbb, sizeof(tbb), &count);

LRESULT lID = SendMessage(myTray,TB_COMMANDTOINDEX,(WPARAM) i,NULL);
cout << "...iButton -> " << lID << endl;
cout << "...idButton -> " << i << endl;
cout << "...Tooltip -> " << text << endl;
cout << "...iString -> " << (CHAR) tbb.iString << endl;
cout << "...Style -> " << (int)tbb.fsStyle << endl;
cout << "...idCommand -> " << tbb.idCommand << endl;
}

VirtualFreeEx(hProc, &tbb, sizeof(tbb), MEM_RELEASE);
VirtualFreeEx(hProc, &text, sizeof(text), MEM_RELEASE);
CloseHandle(hProc);

Тебе осталось только разовраться в нем и сделать по аналогии




Ранг: 327.3 (мудрец)
Активность: 0.250
Статус: Участник

Создано: 13 декабря 2005 16:43
· Личное сообщение · #16

спасибо за помощь, код получился такой

var
ProcessId: DWORD;
Process: THandle;
vPointer: Pointer;
Buffer: array [byte] of char;
NumberOfBytesRead: Cardinal;
Item: TLVItem;
hListView:HWND;
ItemsCount,i:integer;

begin

hListView:=$000B028C;
GetWindowThreadProcessId(hListView, @ProcessId);
Process := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, ProcessId);

vPointer := VirtualAllocEx(Process, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
ItemsCount := SendMessage(hListView, LVM_GETITEMCOUNT, 0, 0);

try
for i := 0 to ItemsCount do begin
with Item do begin
mask := LVIF_TEXT;
iItem := i;
iSubItem := 0;
cchTextMax := SizeOf(Buffer);
pszText := Pointer(Cardinal(vPointer) + SizeOf(TLVItem));
end;
WriteProcessMemory(Process, vPointer, @Item, SizeOf(TLVItem), NumberOfBytesRead);
SendMessage(hListView, LVM_GETITEM , I, lparam(vPointer));
ReadProcessMemory(Process, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)), @Buffer[0], SizeOf(Buffer), NumberOfBytesRead);

memo1.Lines.Add(Buffer);

end;
finally
VirtualFreeEx(Process, vPointer, 0, MEM_RELEASE);
CloseHandle(Process);
end;
end;




этот код отлично работает с любым классом окна вида SysListView32 или TListView, но вот список у Касперского KAVGUI_ListCtrl, c ним это не срабатывает, или ничего не выдирает либо белиберда какай-то.
Какой подход для выдирания из этого списка искать ??

-----
in search of sunrise




Ранг: 32.4 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 14 декабря 2005 07:08
· Личное сообщение · #17

Что-то я такого списка в каспере пятом personal pro
bloom пишет:
KAVGUI_ListCtrl

найти не могу

P/S мне кажется, что Касперский не должен давать возможность записи в его процесс? или я ошибаюсь?




Ранг: 327.3 (мудрец)
Активность: 0.250
Статус: Участник

Создано: 14 декабря 2005 16:38
· Личное сообщение · #18

t3stament01
в 5-м Персонал на вкладке Настройка -> Угрозы и исключения -> Показать список угроз (синим шрифтом)

-----
in search of sunrise





Ранг: 327.3 (мудрец)
Активность: 0.250
Статус: Участник

Создано: 16 декабря 2005 21:02
· Личное сообщение · #19

на одном из форумов ответили

Что, если этот Каспер отрисовку элементов выполняет самостоятельно? Валяется у него массивчик каких ему вздумается данных, а он в каком-нибудь NM_CUSTOMDRAW свинячит текст на экран. Конечно, программно в этом случае выдрать данные можно, но только проанализировав код Каспера. А общего решения (кроме подобных вышепредложенному) не существует.

каспер очередной раз победил((((

-----
in search of sunrise





Ранг: 327.3 (мудрец)
Активность: 0.250
Статус: Участник

Создано: 30 апреля 2006 14:35
· Личное сообщение · #20

Getting ListView items in C# from SysListView32 using SendMessage
www.thescripts.com/forum/thread258027.html

-----
in search of sunrise



 eXeL@B —› Основной форум —› Техника и утилиты захвата данных из списков
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати