Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Подскажите, как извлечь информацию из окна класса


Автор: Гость_max 13.12.2003, 12:06
А ситуация у меня такая. Есть .chm файл справки, в открытом виде
окно этой справки содержит в себе дочернее окно класса SysTreeVIew32,
в котором выведены разделы справки в виде дерева. Хочу получить в
цикле текст всех деревьев и всех его листьев. Состряпал такую процедурку:
Код

Private Sub Command3_Click()
'идентификатор пункта TreeView
Dim item As Long
'счетчик цикла
Dim i As Integer
'получим идентефикатор корневого пункта
item = SendMessage(TreeView1.hwnd, TVM_GETNEXTITEM, TVGN_ROOT, 0)

'подготовим структуру для извлечения текста из пункта TreeView
Dim tvi As TV_ITEM
  With tvi
     .mask = TVIF_TEXT
     .hItem = item
     .pszText = String$(255, 0)
     .cchTextMax = 255
  End With
'получим информацию в заготовленную структуру
SendMessage TreeView1.hwnd, TVM_GETITEM, 0&, tvi
'выведем извлеченный текст
Debug.Print "текст = " & tvi.pszText
'повторим извлечение текста из остальных пунктов Treeview
For i = 1 To 3
item = SendMessage(TreeView1.hwnd, TVM_GETNEXTITEM, TVGN_NEXT, ByVal item)
With tvi
     .mask = TVIF_TEXT
     .hItem = item
     .pszText = String$(255, 0)
     .cchTextMax = 255
  End With
SendMessage TreeView1.hwnd, TVM_GETITEM, 0&, tvi
Debug.Print "текст = " & tvi.pszText
Next i
End Sub

Проблема, если в SendMassage ставлю хэндл Treeview контрола, который лежит у
меня на форме, то текст заполучаю без проблем, но если подставить хэндл
дочернего окна справки класса SysTreeVIew32, при прохождении строки:
Код

  SendMessage хэндл_окна, TVM_GETITEM, 0&, tvi

выдается ошибка:

Программа HH вызвала сбой при обращении к странице памяти
в модуле COMCTL32.DLL по адресу 0167:82630026.
Регистры:
и т.д. и т.п.

Подскажите, кто знает в чем может быть причина, что из родного TreeView читаем без
проблем, а на чужой ругаетсяconfused.gif

Автор: Гость_Serj 14.12.2003, 01:07
Я так понял, что ты хочешь получить инфу из Tree другого процесса?! Если да, то твой метод не пройдет. Здесь надо писать длл и внедрятся в чужой процесс. В этом процессе выделить необходимый объем памяти для копирования твоей "tvi" и скопировать ее в адресное пространство чужого процесса. А уж потом - SendMessage хэндл_окна, TVM_GETITEM, 0&, tvi . И после этого надо прочитать данные из памяти чужого процесса. В общем мутное это дело.

Автор: Unregistered 14.12.2003, 12:35
Гость_Serj, подскажи, плиз, как на VB можно внедрить длл в чужой процесс?
Все таки хочется увидеть, что может получиться.

Автор: Гость_Serj 14.12.2003, 17:04
Такую длл писать надо на С++. Советую купить книгу "Программирование в Win32 API" Стивен Роман. Там как раз речь о твоем случае.

Автор: Unregistered 14.12.2003, 21:31
Цитата

Такую длл писать надо на С++. Советую купить книгу "Программирование в Win32 API" Стивен Роман. Там как раз речь о твоем случае.

Не подскажешь, может где-то можно найти ее электронный вариант?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)