Как обратиться к свойствам объекта, зная его HWND ?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Как обратиться к свойствам объекта, зная его HWND ?

Сообщение ALX_2002 » 18.05.2006 (Чт) 9:27

Доброго времени суток други. Подскажите пожалуйста где посмотреть данный сабж ?

Что то поиски успехом не увенчались. :(

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 18.05.2006 (Чт) 9:35

т.е. к контролу VB зная его hwnd? Разве что тупым перебором искать контрол с нужным hwnd а затем уже обращаться к свойствам. Или через соответствующие свойству функции API или сообщения
Весь мир матрица, а мы в нем потоки байтов!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.05.2006 (Чт) 10:06

Каким именно свойствам? VB-шным? Через API?
Lasciate ogni speranza, voi ch'entrate.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 18.05.2006 (Чт) 10:17

Никак. hwnd характеризует окно контрола (если оно вообще есть), а не его функционал.
Лучший способ понять что-то самому — объяснить это другому.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 18.05.2006 (Чт) 10:31

Угу. Уточню, что хочу сделать.

У компонента WebBrowser есть свойство ExecWB

Оно позволяет распечатать страничку (и не только, как я понял) с определёнными параметрами.

Код: Выделить всё
Wb.ExecWb OLECMDID_PRINT .....


Если работать с этим компонентом, то проблем нет.

Я же продолжаю ковыряться с Activex.

Я загружаю страничку, которая содержит этот Activex.

Очень хотелось бы обратиться из Activex к объекту IE. А точнее к свойству IE.ExecWB. Если оно конечно у него есть, а то может только у контрола такое имеется ?

2 Antonariy: А как нибудь ещё вышесказанное реализовать можно ?

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 18.05.2006 (Чт) 10:44

ShellWindows возвращает коллекцию окон ИЕ
перебери и найди нужное
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 18.05.2006 (Чт) 10:49

Точно.
Лучший способ понять что-то самому — объяснить это другому.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 18.05.2006 (Чт) 12:15

Отлично... Перебрал, нашёл. Хотя правда не понятно чего искать. HWND ? Он и так есть - Usercontrol.ContainerHwnd . А дальше то как ?

Как к методу то обратиться ? :shock:

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 18.05.2006 (Чт) 14:21

ALX_2002 писал(а):Отлично... Перебрал, нашёл. Хотя правда не понятно чего искать. HWND ? Он и так есть - Usercontrol.ContainerHwnd . А дальше то как ?

Как к методу то обратиться ? :shock:


Ээээ? Какой такой UserControl?!?!?!?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 18.05.2006 (Чт) 14:37

Код: Выделить всё
Public Sub Print()
Dim winShell As New SHDocVw.ShellWindows
Dim var As SHDocVw.InternetExplorer
    On Error Resume Next
    For Each var In winShell
        If TypeName(var.document) = "HTMLDocument" Then
            If var.document.location.href = yourdoclochref then var.ExecWB OLECMDID_PRINT
        End If
    Next
End Sub
Лучший способ понять что-то самому — объяснить это другому.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.05.2006 (Чт) 15:05

Я перестаю понимать происходящее...

Вот я сейчас набросал контрол, весь код которого:
Код: Выделить всё
Option Explicit

Private Sub UserControl_DblClick()
  Dim p As Object
 
  On Error GoTo noparent
  Set p = UserControl.Parent
  If p Is Nothing Then
    MsgBox "Parent property is Nothing.", vbInformation
  Else
    MsgBox "Parent is of type " & TypeName(p)
  End If
 
  Exit Sub
 
noparent:
  MsgBox "Cannot get Parent property: " & vbNewLine & Err.Number & vbNewLine & Err.Description, vbExclamation
End Sub


Зарегил, написал в HTML:
Код: Выделить всё
<html><body><object CLASSID="clsid:9384FDC8-3C24-443D-8907-73ADDC7C3E58" width="100" heigth="100"></object></body></html>


Даблкликнул по жёлтому прямоугольнику, получил
---------------------------
prjfooControl
---------------------------
Parent is of type HTMLDocument
---------------------------
ОК
---------------------------


В чём проблема, объясните? :roll:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 18.05.2006 (Чт) 15:51

GSerg писал(а):Я перестаю понимать происходящее...

Вот я сейчас набросал контрол, весь код которого:
Код: Выделить всё
Option Explicit

Private Sub UserControl_DblClick()
  Dim p As Object
 
  On Error GoTo noparent
  Set p = UserControl.Parent
  If p Is Nothing Then
    MsgBox "Parent property is Nothing.", vbInformation
  Else
    MsgBox "Parent is of type " & TypeName(p)
  End If
 
  Exit Sub
 
noparent:
  MsgBox "Cannot get Parent property: " & vbNewLine & Err.Number & vbNewLine & Err.Description, vbExclamation
End Sub


Зарегил, написал в HTML:
Код: Выделить всё
<html><body><object CLASSID="clsid:9384FDC8-3C24-443D-8907-73ADDC7C3E58" width="100" heigth="100"></object></body></html>


Даблкликнул по жёлтому прямоугольнику, получил
---------------------------
prjfooControl
---------------------------
Parent is of type HTMLDocument
---------------------------
ОК
---------------------------


В чём проблема, объясните? :roll:


2 Gserg: Мда.... Воооооообще не в теме....
:D

2 Antonariy: ВООБЩЕ ОТЛИЧНО ! СПАСИБ ГРОМАДНОЕ ! Только почему то когда делаю в VB контрол и запускаю его в среде самого VB, то это окно не включается в коллекцию ShellWindows

В кратце - По ходу только если с URL загрузил, то пашет, а если локально то облом...

Хотя может я кривой. :D

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 18.05.2006 (Чт) 16:19

Хм..... Оказалось всё несколько сложнее

Сравнил UserControl.ContainerHwnd и перебрал var.hwnd

Не один не совпадает с ContainerHwnd

:shock: :shock: :shock:

Why SO ?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.05.2006 (Чт) 16:38

ALX_2002 писал(а):2 Gserg: Мда.... Воооооообще не в теме....
:D

Так объясни подробнее.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 18.05.2006 (Чт) 16:41

ALX_2002
Spy++ тебе в помощь 8)

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 18.05.2006 (Чт) 16:49

GSerg писал(а):
ALX_2002 писал(а):2 Gserg: Мда.... Воооооообще не в теме....
:D

Так объясни подробнее.


http://bbs.vbstreets.ru/viewtopic.php?p=6605352#6605352

Дык куда ж ещё подробнее то ? :shock: :D

2 Konst_One: Ооо... Эт дело тёмное.... :oops:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.05.2006 (Чт) 16:53

Что значит куда подробнее?

Метод ExecWB находится в IWebBrowser2, и для меня совсем не очевидно, куда ты загружаешь html, в контрол webbrowser или в IE отдельно.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 18.05.2006 (Чт) 16:59

GSerg
я так понял, что у него формочка , а на ней WebBrowser контрол, в котором он страничку открывает :lol:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.05.2006 (Чт) 17:37

Странно всё это.
Пути от document к browser я так и не нашёл (хотя обратный есть).
Однако, ExecWB является обёрткой над IOleCommandTarget::Exec, а IHTMLDocument2 имеет метод execCommand, который является обёрткой над ней же, просто менее функциональной.
Поэтому вывод заключается в том, что либо будет достаточно функционала execCommand, либо надо просто скастовать IHTMLDocument2 к IOleCommandTarget (что разрешается) и вызвать Exec напрямую...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 18.05.2006 (Чт) 17:44

GSerg писал(а):Странно всё это.
Пути от document к browser я так и не нашёл (хотя обратный есть).
Однако, ExecWB является обёрткой над IOleCommandTarget::Exec, а IHTMLDocument2 имеет метод execCommand, который является обёрткой над ней же, просто менее функциональной.
Поэтому вывод заключается в том, что либо будет достаточно функционала execCommand, либо надо просто скастовать IHTMLDocument2 к IOleCommandTarget (что разрешается) и вызвать Exec напрямую...


:shock: :shock: :shock: Ммм... А русской версии у вас нету ??

Челы. Я ж говорю - я не использую компонент WEBBROWSER

У меня обычное окно IE. Я загружаю страничку с Activex и мне нужно, чтобы этот ЧЁРТОВ ACTIVEX смог обратиться к родному окну, чтобы оно распечаталось без каких либо запросов к пользователю.

Можно так сделать ???? :cry: :cry: :cry:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.05.2006 (Чт) 17:47

Можно так сделать. Читай мои посты в этой теме, начиная с первого.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 18.05.2006 (Чт) 18:48

GSerg писал(а):Можно так сделать. Читай мои посты в этой теме, начиная с первого.


Внимательно прочитал. Как получить управление над родительским документом я знаю.

Далее пользовался Window.print. Не устраивает. Вызывает диалог выбора принтера.

Мне нужно получить доступ к самому IE.

:(

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 18.05.2006 (Чт) 19:30

Только почему то когда делаю в VB контрол и запускаю его в среде самого VB, то это окно не включается в коллекцию ShellWindows
У webbrowser'а есть свойство RegisterAsBrowser, если оно false - его в ShellWindows нет.
Мне нужно получить доступ к самому IE.
А мой пример не работает?
Лучший способ понять что-то самому — объяснить это другому.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.05.2006 (Пт) 6:09

Странно ты читаешь внимательно.

GSerg писал(а):IHTMLDocument2 имеет метод execCommand

GSerg писал(а):либо надо просто скастовать IHTMLDocument2 к IOleCommandTarget (что разрешается) и вызвать Exec напрямую
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 19.05.2006 (Пт) 19:12

2 Gserg:
GSerg писал(а):Странно ты читаешь внимательно.

GSerg писал(а):IHTMLDocument2 имеет метод execCommand

GSerg писал(а):либо надо просто скастовать IHTMLDocument2 к IOleCommandTarget (что разрешается) и вызвать Exec напрямую


Дружище. Я б рад "скастовать". Но вот это слово для меня звучит как - трансгрессировать или проинтерполировать :D

Намекни пожалста - как это делать :)

2 Antonariy: Пример работает. За него огромное спасибо :)

Только проблемка - не могу найти родительское окно где находится ACTIVEX по HWND.

Я взял Activex.ContainerHWND и перебрал коллекцию ShellWindows сравнивая с их HWND окон IE

И не совпадают они гады :roll: Чего то не то я с ними делаю видимо :oops:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.05.2006 (Сб) 16:03

Это делается оператором Set в VB.


А первый вариант даже не рассматривается?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 22.05.2006 (Пн) 9:44

Я взял Activex.ContainerHWND и перебрал коллекцию ShellWindows сравнивая с их HWND окон IE

И не совпадают они гады Чего то не то я с ними делаю видимо
var.hwnd (см пример) не работает для вебконтрола (уже обсуждалось), только для окна собственно ie. Поэтому я и сравниваю адреса документов.
Лучший способ понять что-то самому — объяснить это другому.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 22.05.2006 (Пн) 11:02

Новые проблемы... :(

2 Antonariy:
Antonariy писал(а):
Я взял Activex.ContainerHWND и перебрал коллекцию ShellWindows сравнивая с их HWND окон IE

И не совпадают они гады Чего то не то я с ними делаю видимо
var.hwnd (см пример) не работает для вебконтрола (уже обсуждалось), только для окна собственно ie. Поэтому я и сравниваю адреса документов.


Эх... Жаль... Ну да ничего. перебрал по URL - нашёл

Только не понял почему var.hwnd. У меня же вроде UserControl.ContainerHWND. У UserControla HWND работает ? :(

Вот что написал в Activex

Код: Выделить всё

Dim IeWindows As New shdocvw.ShellWindows
Dim IeWindow As shdocvw.WebBrowser

Private Sub UserControl_Show()

    For Each IeWindow In IeWindows
       If TypeName(IeWindow.document) = "HTMLDocument" Then
            If IeWindow.document.Url = UserControl.Parent.Url Then
                Exit For
            End If
        End If
    Next

End Sub

Public Property Get IeObject() As shdocvw.InternetExplorer
   Set IeObject = IeWindow
End Property



А вот код странички

Код: Выделить всё
<OBJECT CLASSID="clsid:3338F078-B63E-4982-8263-0E0D3BF95168" id=CTRL></OBJECT>

sdasdasdasdsadasd

<SCRIPT language="vbscript">
Sub Document_onclick()
  CTRL.IeObject.ExecWB 2,6
End sub
</SCRIPT>


Потом вызвал метод ExecWB и IE выпал с грохотом. ошибкой

Исключение unknown software exception (0xc00000fd) в приложении по адресу 0x635e2ca2

Падает метод ExecWB. Пока что не могу въехать почему.

2 GSerg:

либо надо просто скастовать IHTMLDocument2 к IOleCommandTarget (что разрешается) и вызвать Exec напрямую


ну хоть как нибудь на пример на это взглянуть можно ? :(

Научи плиз.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 22.05.2006 (Пн) 12:36

Только не понял почему var.hwnd.
У ие довольно мутная структура окон, не могу представить, что вернет ContainerHWND. Попробуй апи GetParent(UserControl.hwnd).
Падает метод ExecWB. Пока что не могу въехать почему.

Потому что перепутал параметры
Код: Выделить всё
CTRL.IeObject.ExecWB 6,2
Последний раз редактировалось Antonariy 22.05.2006 (Пн) 12:51, всего редактировалось 1 раз.
Лучший способ понять что-то самому — объяснить это другому.

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 22.05.2006 (Пн) 12:49

2 Antonarij:

Пробывал через GetParent и GetWindow :( Так и не смог провалиться на родительский HWND.

:shock:

---

Как Object тоже поппробывал. :D Тот же самый результат.

при чём если подсовываю ExecWB 2,6 то всё выпадает с треском и IE закрывается, а если ExecWB 0,0 то просто ошибка вылезает о неправильности параметров. Обращения к другим методам работаю нормально. Хм...

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Mail.ru [бот] и гости: 37

    TopList