VBScript: Получение модального окна браузера
От: Аноним  
Дата: 25.03.08 10:09
Оценка:
Всем привет!


Разработчики реализовали на нажатии кнопки появление модального IE-окна — showModalDialog (кнопки на панели задачи этого окна нет). Данное окно есть дочерним главного IE-окна.

Как можно получить доступ к DOM-объекту страницы этого модального окна, если Hwnd как окна, так и IEBrowser_Server контрола я могу определить (я зарегистрировал несколько WinApi функций, которая возвращает хэндл последнего попап окна).

Спасибо за помощь.
Re: VBScript: Получение модального окна браузера
От: Аноним  
Дата: 25.03.08 12:19
Оценка:
Добрый день.

Нашел следующую WinApi функцию: AccessibleObjectFromWindow. Как можно ее закрутить, что бы добраться до DOM-структуры IE модального окна??

Вот ее описание:

Declare Function AccessibleObjectFromWindow Lib "oleacc" _

    (ByVal hWnd As Long, ByVal dwId As Long, _

    riid As tGUID, ppvObject As Object) As Long
Re[2]: VBScript: Получение модального окна браузера
От: Аноним  
Дата: 27.03.08 07:10
Оценка:
Нашел пример на Visual Basic. Как теперь это все переписать на VBScript??

Option Explicit

Private Type UUID
   Data1 As Long
   Data2 As Integer
   Data3 As Integer
   Data4(0 To 7) As Byte
End Type

Private Declare Function FindWindow Lib "User32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "User32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function ObjectFromLresult Lib "oleacc" (ByVal lResult As Long, riid As UUID, ByVal wParam As Long, ppvObject As Any) As Long
Private Declare Function RegisterWindowMessage Lib "User32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
Private Declare Function SendMessageTimeout Lib "User32" Alias "SendMessageTimeoutA" (ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, lParam As Any, ByVal fuFlags As Long, ByVal uTimeout As Long, lpdwResult As Long) As Long

Private Declare Function GetClassName Lib "User32" (ByVal hwnd As _
         Integer, ByVal lpClassName As String, ByVal nMaxCount As _
         Integer) As Integer

Private Declare Function GetWindowText Lib "User32" Alias "GetWindowTextA" (ByVal hwnd As _
         Integer, ByVal lpString As String, ByVal aint As Integer) As _
         Integer

Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long


Private Const SMTO_ABORTIFHUNG = &H2




Public WithEvents objDoc As HTMLDocument

' Create a web document object to control browser
'Private mhtmDoc3 As IHTMLDocument3
'Private WithEvents objDoc As HTMLDocument


Dim FocusHwnd As Long
Dim CurrentFocusWindowTitle As String * 255
Dim LastFocusWindowTitle As String * 255


Dim mx, my

Private Sub Command1_Click()
    Dim hwnd As Long
    '"coozzzzz - coozzzzz" is the title of the IM window
    hwnd = FindWindow("IEFrame", CurrentFocusWindowTitle)

    hwnd = FindWindowEx(hwnd, 0, "Shell DocObject View", vbNullString)

    hwnd = FindWindowEx(hwnd, 0, "Internet Explorer_Server", vbNullString)

    If hwnd > 0 Then
        Set objDoc = WindowDOM(hwnd)
        If Not (objDoc Is Nothing) Then
          Text1.Text = objDoc.body.innerText
          LastFocusWindowTitle = CurrentFocusWindowTitle
        End If
    End If

End Sub

Private Function WindowDOM(ByVal hwnd As Long) As IHTMLDocument
    Dim typUUID As UUID, lngRes As Long, lngMsg As Long
    lngMsg = RegisterWindowMessage("WM_HTML_GETOBJECT")
    If lngMsg <> 0 Then
        Call SendMessageTimeout(hwnd, lngMsg, 0, 0, SMTO_ABORTIFHUNG, 1000, lngRes)
        If lngRes <> 0 Then
            With typUUID
                .Data1 = &H626FC520
                .Data2 = &HA41E
                .Data3 = &H11CF
                .Data4(0) = &HA7
                .Data4(1) = &H31
                .Data4(2) = &H0
                .Data4(3) = &HA0
                .Data4(4) = &HC9
                .Data4(5) = &H8
                .Data4(6) = &H26
                .Data4(7) = &H37
            End With
            Call ObjectFromLresult(lngRes, typUUID, 0, WindowDOM)
        End If
    End If
End Function



Private Sub Timer1_Timer()
Dim a As Long
FocusHwnd = GetForegroundWindow
a = GetWindowText(FocusHwnd, CurrentFocusWindowTitle, Len(CurrentFocusWindowTitle))

If (CurrentFocusWindowTitle <> LastFocusWindowTitle) Then
Command1_Click
End If

End Sub
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.