На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: SCINER, B.V.
  
    > Как работать со всеми окнами ИЕ , Подключаемся к окнам Internet Explorer'a
      Вторая редакция

      Будем исходить из того, что объектная модель ИЕ дает нам возможность реагировать на события, и главное для нас грамотно получить возможность реагировать на них. Для этого в проекте нужно создать ссылки на объекты: Microsoft HTML Object Library и Microsoft Internet Controls (Меню Project>Reference shdocvw.dll и mshtml.tlb)
      Далее нам нужно создать класс, отвечающий за работу с окном ИЕ. Он должен выглядеть так:

      clsBrowser
      ExpandedWrap disabled
        Option Explicit
        Dim WithEvents brows As WebBrowser
        Dim HTMLdoc As HTMLDocument
         
        Public Sub Attach(ByVal obj As WebBrowser)
        Set brows = obj
        End Sub
         
        'Здесь можно обрабатывать Загруженный документ
        Private Sub brows_DocumentComplete(ByVal pDisp As Object, URL As Variant)
        'пустые страницы игнорировать
        If brows.LocationURL = "about:blank" Then Exit Sub
        Set HTMLdoc = brows.document
        'выведем на экран содержимое документа, что бы было понятно, что это работает
        MsgBox HTMLdoc.documentElement.innerHTML
        End Sub
         
        Private Sub Class_Terminate()
        Set brows = Nothing
        Set HTMLdoc = Nothing
        End Sub

      Поясняю вышеизложенный код - метод Attach вернет в наш класс объект HTMLBrowser, тот самый, который отвечает за отображение страницы. Получив этот объект мы приобретаем доступ к его свойствам, методам и событиям. Одно из событий для наглядности я сразу и реализовал – DocumentComplete, оно происходит при полной загрузке документа, в нем содержимое документа будет выведено в MsgBox'e . Вам никто не мешает реализовать свой код для обработки этого или любого другого события из имеющихся у объекта WebBrowser.

      Теперь нам нужен класс назначающий уже открытым окнам ИЕ наш обработчик clsBrowser и добавляющий его новым создаваемым окнам ИЕ. В основе его работы лежит объект ShellWindows из Microsoft Internet Controls.
      В моём случае код немного громоздкий и извращенный, но других мыслей по этому поводу у меня нет, а код от этого хуже работать не будет, а может даже и лучше. Вот код:
      clsIE_Control
      ExpandedWrap disabled
        Option Explicit
        Dim WithEvents IShellWindows As ShellWindows
        Dim BrowsersSpy() As New clsBrowser
         
        'Назначение контролов уже открытым окнам ИЕ
        Private Sub Class_Initialize()
        Set IShellWindows = New ShellWindows
        AttachAll
        End Sub
         
        'Чистим мусор
        Private Sub Class_Terminate()
        Set IShellWindows = Nothing
        DetachAll
        ReDim BrowsersSpy(0)
        End Sub
         
        'связываем вновь созданное окно ИЕ с нашим объектом
        Private Sub IShellWindows_WindowRegistered(ByVal lCookie As Long)
        ReDim Preserve BrowsersSpy(0 To IShellWindows.Count)
        BrowsersSpy(IShellWindows.Count - 1).Attach ByVal IShellWindows.Item(IShellWindows.Count - 1)
        End Sub
         
        'связываем окна ИЕ с нашими объектами
        Private Sub AttachAll()
        Dim i As Integer
        ReDim BrowsersSpy(0 To IShellWindows.Count)
        For i = 0 To IShellWindows.Count - 1
            BrowsersSpy(i).Attach ByVal IShellWindows.Item(i)
        Next i
        End Sub
         
        'разрываем связь между окнами ИЕ и чистим массив от объектов
        Private Sub DetachAll()
        Dim i As Integer
        For i = 0 To UBound(BrowsersSpy)
            Set BrowsersSpy(i) = Nothing
        Next i
        End Sub
         
        'обрабатываем закрытие одного из окон
        Private Sub IShellWindows_WindowRevoked(ByVal lCookie As Long)
            DetachAll
            AttachAll
        End Sub


      Как вы поняли из кода, он просто следит за изменениями в объекте ShellWindows, который реагирует на создание окна ИЕ и его уничтожение. В случае создания окна мы получаем к нему доступ, создаем экземпляр нашего clsBrowser и передаем ему через метод Attach объект WebBrowser, что бы он мог сделать всю дальнейшую работу.

      Теперь последняя деталь, нам нужно объявить переменную класса clsIE_Control и инициализировать ее. Для этого предлагаю сделать форму и в ней разместить следующий код:

      ExpandedWrap disabled
        Dim myIE As clsIE_Control
         
        Private Sub Form_Load()
        Set myIE = New clsIE_Control
        End Sub
         
        Private Sub Form_Unload(Cancel As Integer)
        Set myIE = Nothing
        End Sub


      Наша программа готова, она должна выводить массажбокс с хтмл-содержимым любой страницы, загруженной любым окном ИЕ. Но нам ничто не мешает в clsBrowser реализовать код, реагирующий на любые другие события, которые предоставляет WebBrowser.

      Желаю успехов!
      Сообщение отредактировано: Vasya2000 -
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0157 ]   [ 16 queries used ]   [ Generated: 30.04.24, 15:53 GMT ]