| Автор
| Сообщение |
KBak
Новичок

Зарегистрирован: 09.08.2007
Сообщения: 5
|
|
|
Цитата |
|
В чужом окне есть некая таблица. Мне нужно скопировать оттуда текст. С помощью функции EnumChildWindows я искал объекты в окне. Нашлось 3 класса: 1)Afx:00400000:8:000014A6:00000000:00000000, 2)SysListView32, 3)SysHeader32.
Так как мне добратся до текста?
|
|
| В начало |
|
 |
|
|
 |
|
|
|
Цитата |
|
| getwindowtext чего-н может достать ?
|
|
| В начало |
|
 |
KBak
Новичок

Зарегистрирован: 09.08.2007
Сообщения: 5
|
|
|
Цитата |
|
| getwindowtext ничего не находит. Да и чего он должен найти если это таблица с ячейками... Наверно надо как-то извлекать текст из каждой ячейки.
|
|
| В начало |
|
 |
 Stilet
Новичок

Возраст: 28
Знак зодиака: 
Зарегистрирован: 01.08.2007
Сообщения: 3
Откуда: Украина, Донецкая обл. г.Краматорск
|
|
|
Цитата |
|
| А с чего автор взял что у этой таблицы и тем более у ее ячеек хендл есть? WinSpector или SpyXX тебе в помощь. И скорее всего это будет сделать невозможно.
|
|
| В начало |
|
 |
 Шурик
Я живу тут....

Возраст: 42
Знак зодиака: 
Зарегистрирован: 15.01.2003
Сообщения: 1951
Откуда: Киев
|
|
|
Цитата |
|
А что это такое ты исследуешь? Картинку покажи, что ли. Посмотри SpyX или чем-то подобным, где сама таблица. Из того, что ты написал, есть вероятность, что таблица -- это ListView. Если так, наверно есть шанс добраться до его узлов через посыл сообщений.
_________________ Ответ готов, готов ли твой вопрос? |
|
| В начало |
|
 |
KBak
Новичок

Зарегистрирован: 09.08.2007
Сообщения: 5
|
|
|
Цитата |
|
Смотрел через winspector. Увидел что из объекта SysListView32 вытекает SysHeader32. Если заглянуть в свойства этих объектов то там есть колонка 'class specific' в которой у SysHeader32 записано число столбцов, а у SysListView32 число соответсвует числу строк не считая строки с названиями столбцов.
В примере эти числа равны 2 и 0.
| Описание: |
|
| Размер: |
16.97 KB |
| Просмотрено: |
4295 раз(а) |

|
|
|
| В начало |
|
 |
 Шурик
Я живу тут....

Возраст: 42
Знак зодиака: 
Зарегистрирован: 15.01.2003
Сообщения: 1951
Откуда: Киев
|
|
|
Цитата |
|
Мне кажется, это стандартный ListView. Попробуй следующее:
- В Дельфи создай форму
- брось на неё ListView из закладки Win32
- поставь ViewStyle=vsReport, добавь Columns, Items, включи GridLines
- запусти и посмотри утилитой "шпионом"
Мне кажется, ты увидишь там те же классы.
Посмотри сюда. Мне кажется этими сообщениями ты что-то сможешь до ListView достучаться.
Конечно, я могу и ошибаться. Но это всё очень похоже на ListView...
_________________ Ответ готов, готов ли твой вопрос? |
|
| В начало |
|
 |
KBak
Новичок

Зарегистрирован: 09.08.2007
Сообщения: 5
|
|
|
Цитата |
|
Дайте ссылочку где на русском языке есть описание подобных функций:
- LVM_GETITEM
- LVM_GETITEMTEXT
Или объясните что там за параметры такие (хорошо бы с примерчиком).
|
|
| В начало |
|
 |
 Шурик
Я живу тут....

Возраст: 42
Знак зодиака: 
Зарегистрирован: 15.01.2003
Сообщения: 1951
Откуда: Киев
|
|
| В начало |
|
 |
|
|
 |
KBak
Новичок

Зарегистрирован: 09.08.2007
Сообщения: 5
|
|
|
Цитата |
|
Вот как бы я нашел следующий код и у меня по нему пара вопросов
| delphi: | Function listview(h: hwnd): BOOL; stdcall; var ProcessId: DWORD; Process: THandle; vPointer: Pointer; Buffer: array [byte] of char; NumberOfBytesRead: Cardinal; Item: TLVItem; hListView:HWND; ItemsCount,i:integer; Buf : array [0..150] of char; begin hListView := h; GetClassName(hListView, buf, 150); if buf <> 'SysListView32' then exit; form1.memo1.Lines.Add('list naiden'); 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); form1.memo1.Lines.Add(Buffer); end; finally VirtualFreeEx(Process, vPointer, 0, MEM_RELEASE); CloseHandle(Process); end; end; procedure TForm1.Button1Click(Sender: TObject); var h:HWND; begin Memo1.Clear; h:=FindWindow(nil, 'Xxx'); if h <> 0 then EnumChildWindows(h, @listview, 0); end;
|
Действительно ли чтоб получить текст должно быть все так сложно?
И собственно этот код выводит фигню ... может кто подскажет почему?
|
|
| В начало |
|
 |
|