1

Тема: VBScript: перечисление дочерних окон (дескрипторы и имена классов)

Пример перечисляет дочерние окна интерфейса Internet Explorer с получением дескриптора и имени класса каждого из них, результаты выводятся в само окно Internet Explorer.
Потребуется библиотека dynwrap.dll и установленный LangMF 7.7.

    '------------------------------------------------------------------------------------------
    'Скрипт предназначен для перечисления дочерних окон интерфейса Internet Explorer
    'с получением дескриптора и имени класса каждого из них.
    '------------------------------------------------------------------------------------------
    'Language:            VBScript
    'Используется             библиотека dynwrap.dll
    'Используется              библиотека LangMF.dll,7.7.0.0 или установленный LangMF 7.7
    
    Dim ieHWND    
    Dim Dict

    'Объявление вызовов WinApi и основных агрегатных объектов
    '------------------------------------------------------------------------------------------
    Set GetClassNameC        =CreateObject("DynamicWrapper")
    GetClassNameC.Register         "USER32.DLL","GetClassName","i=hll","f=s","r=l"
    '------------------------------------------------------------------------------------------
    Set MultiByteToWideCharC    =CreateObject("DynamicWrapper") 
    MultiByteToWideCharC.Register     "KERNEL32.DLL","MultiByteToWideChar","f=s","i=llllll","r=l"
    '------------------------------------------------------------------------------------------
    Set LMActiveX    =CreateObject("Atomix.LangMF")
    WScript.Sleep(100)

    'Создание экземпляра окна Internet Explorer
    '------------------------------------------------------------------------------------------
    Set objIE    =CreateObject("InternetExplorer.Application")

    objIE.Visible=True
    objIE.Navigate("about:blank")
    
        WScript.Sleep(500)
    ieHWND=CLng(objIE.HWND)
        WScript.Sleep(500)
    
    Set objDocument=objIE.Document.parentWindow.document
    
    'Имплементация кода LangMF в область VBSCript.Перебор дочерних окон (callback) и получение их дескрипторов.
    '--------------------------------------------------------------------------------------------------------------------
    LMFCode= _
    "<#Module=subcls>                                                \" & _
    "    HwndArr=''                                                \" & _
    "Sub Load(cmdstr)                                                \" & _
    "End Sub                                                    \" & _
    "                                                        \" & _
    "Function InitEnum(lHwnd)                                            \" & _
    "    Sys.DynApi.CallFunction 'USER32.DLL','EnumChildWindows',CLng(lHwnd),Sys.Callback('WndProcEnum'),0     \" & _                                                    
    "    InitEnum=HwndArr                                            \" & _
    "End Function                                                    \" & _
    "                                                        \" & _
    "Function WndProcEnum(hwndChild,lParam)                                        \" & _
    "    HwndArr=HwndArr & hwndChild & ';'                                    \" & _
    "    InitEnum(hwndChild)                                            \" & _
    "    WndProcEnum=True                                            \" & _
    "End Function                                                    \" & _
    "                                                        \" & _
    "Function GetStrPtr(cStr)                                            \" & _
    "    GetStrPtr=StrPtr(cStr)                                            \" & _
    "End Function                                                    \" & _
    "                                                        \" & _
    "<#Module>                                                    \"                     
    
    'Модификация кода
    '--------------------------------------------------------------------------------------------------------------------
    LMFCode=Replace(LMFCode,Chr(39),Chr(34))
    LMFCode=Replace(LMFCode,"\",vbCRLF)
    
    'Инициализация кода LangMF
    '------------------------------------------------------------------------------------------
    LMActiveX.Command LMFCode 
    WScript.Sleep(100)

    'Выполнение функции энумератора дочерних окон в области LangMF
    '------------------------------------------------------------------------------------------
    lm=vbNullChar
    lm=LMActiveX.FuncRun("InitEnum",1,ieHWND)
        While lm=vbNullChar
            WScript.Sleep(100)
        Wend
    Dict=Split(lm,";")    'Строка-перечисление дескрипторов дочерних окон
    WScript.Sleep(100)

    'Получение указателя на строку с помощью вызова функции в области LangMF
    '------------------------------------------------------------------------------------------
    baseAddr=LMActiveX.FuncRun("GetStrPtr",1,String(128,Chr(32)))
    baseAddr=CLng(baseAddr)

    '------------------------------------------------------------------------------------------
        '***** Итоговые инструкции ***************************
        '*****************************************************
        objDocument.writeln("<META HTTP-EQUIV='Content-Type' CONTENT='text/html; charset=windows-1251'>")
        objDocument.writeln("<STYLE type='text/css'>BODY {font-family: Lucida Console; color: brown; font-size: 16px; font-weight: 700;}</STYLE>")
        objDocument.writeln("[Parent Window:]<BR>")
            WScript.Sleep(100)
        bLen=GetClassNameC.GetClassName(ieHwnd,baseAddr,128)
        objDocument.writeln(CStr(ieHwnd) & vbTAB & "{" & GetDataBSTR(bLen) & "}<BR><BR>")
            WScript.Sleep(100)    
        objDocument.writeln("[Child Class List:]<BR>")
            WScript.Sleep(100)
        GetChildClasses
        
        '*****************************************************
        Set GetClassNameC    =Nothing
        Set MultiByteToWideCharC=Nothing
        Set objIE        =Nothing
        LMActiveX.Reset
        Set LMActiveX        =Nothing
        WScript.Quit
        '*****************************************************
    
    

    '[Обработка массива возвращенного LangMF.Поиск имени класса для дочерних окон]
    '------------------------------------------------------------------------------------------
    Sub GetChildClasses()
        
        'Оптимизация массива дескрипторов
        '----------------------------------------------------------------------------------
        Dim tbl
        For j=0 To UBound(Dict)-1
            ret=Dict(j) & ";" & Replace(ret,Dict(j) & ";","") 
        Next
        tbl=Split(ret,";")    

        'Формирование записи с именами классов
        '----------------------------------------------------------------------------------
        For i=0 To Ubound(tbl)-1
            hwndChild=Eval(tbl(i))

                'Определение имени класса
                bLen=GetClassNameC.GetClassName(hwndChild,baseAddr,128)
                ClassName=GetDataBSTR(bLen)
                objDocument.writeln(CStr(hwndChild) & vbTAB & "{" & ClassName & "}<BR>")
        Next
        '----------------------------------------------------------------------------------
    End Sub

    
    '*[Возврат строки заданной указателем]
    '------------------------------------------------------------------------------------------
    Function GetDataBSTR(iSize)
        Const CP_ACP=0
        GetDataBSTR=String(iSize,Chr(32))
        pDest=LMActiveX.FuncRun("GetStrPtr",1,GetDataBSTR)
        MultiByteToWideCharC.MultiByteToWideChar CP_ACP,0,baseAddr,-1,pDest,iSize*2+1 
        GetDataBSTR=CStr(GetDataBSTR)
    End Function

Автор примера - Poltergeyst.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

2

Re: VBScript: перечисление дочерних окон (дескрипторы и имена классов)

Тот же пример, но код LangMF вынесен в отдельный файл.

    '------------------------------------------------------------------------------------------
    'Скрипт предназначен для перечисления дочерних окон интерфейса Internet Explorer
    'с получением дескриптора и имени класса каждого из них.
    '------------------------------------------------------------------------------------------
    'Language:            VBScript
    'Используется             библиотека dynwrap.dll
    'Используется              библиотека LangMF.dll,7.7.0.0 или установленный LangMF 7.7
    
    Dim ieHWND    
    Dim Dict

    'Объявление вызовов WinApi и основных агрегатных объектов
    '------------------------------------------------------------------------------------------
    Set GetClassNameC        =CreateObject("DynamicWrapper")
    GetClassNameC.Register         "USER32.DLL","GetClassName","i=hll","f=s","r=l"
    '------------------------------------------------------------------------------------------
    Set MultiByteToWideCharC    =CreateObject("DynamicWrapper") 
    MultiByteToWideCharC.Register     "KERNEL32.DLL","MultiByteToWideChar","f=s","i=llllll","r=l"
    '------------------------------------------------------------------------------------------
    Set WShell    =CreateObject("WScript.Shell")
    WScript.Sleep(100)
    Set LMActiveX    =CreateObject("Atomix.LangMF")
    WScript.Sleep(100)

    'Создание экземпляра окна Internet Explorer
    '------------------------------------------------------------------------------------------
    Set objIE    =CreateObject("InternetExplorer.Application")

    objIE.Visible=True
    objIE.Navigate("about:blank")
    
        WScript.Sleep(500)
    ieHWND=CLng(objIE.HWND)
        WScript.Sleep(500)
    
    Set objDocument=objIE.Document.parentWindow.document
    
    'Инициализация кода LangMF
    '------------------------------------------------------------------------------------------
    LMFCode=WShell.CurrentDirectory & "\EnWndr4.mf"
    LMActiveX.Command LMFCode 
    WScript.Sleep(100)

    'Выполнение функции энумератора дочерних окон в области LangMF
    '------------------------------------------------------------------------------------------
    lm=vbNullChar
    lm=LMActiveX.FuncRun("InitEnum",1,ieHWND)
        While lm=vbNullChar
            WScript.Sleep(100)
        Wend
    Dict=Split(lm,";")    'Строка-перечисление дескрипторов дочерних окон
    WScript.Sleep(100)

    'Получение указателя на строку с помощью вызова функции в области LangMF
    '------------------------------------------------------------------------------------------
    baseAddr=LMActiveX.FuncRun("GetStrPtr",1,String(128,Chr(32)))
    baseAddr=CLng(baseAddr)

    '------------------------------------------------------------------------------------------
        '***** Итоговые инструкции ***************************
        '*****************************************************
        objDocument.writeln("<META HTTP-EQUIV='Content-Type' CONTENT='text/html; charset=windows-1251'>")
        objDocument.writeln("<STYLE type='text/css'>BODY {font-family: Verdana;font-size: 11px; font-weight: 700;}</STYLE>")
        objDocument.writeln("[Parent Window:]<BR>")
            WScript.Sleep(100)
        bLen=GetClassNameC.GetClassName(ieHwnd,baseAddr,128)
        objDocument.writeln(CStr(ieHwnd) & vbTAB & "{" & GetDataBSTR(bLen) & "}<BR><BR>")
            WScript.Sleep(100)    
        objDocument.writeln("[Child Class List:]<BR>")
            WScript.Sleep(100)
        GetChildClasses
        
        '*****************************************************
        Set GetClassNameC    =Nothing
        Set MultiByteToWideCharC=Nothing
        Set objIE        =Nothing
        LMActiveX.Reset
        Set LMActiveX        =Nothing
        WScript.Quit
        '*****************************************************
    
    

    '[Обработка массива возвращенного LangMF.Поиск имени класса для дочерних окон]
    '------------------------------------------------------------------------------------------
    Sub GetChildClasses()
        
        'Оптимизация массива дескрипторов
        '----------------------------------------------------------------------------------
        Dim tbl
        For j=0 To UBound(Dict)-1
            ret=Dict(j) & ";" & Replace(ret,Dict(j) & ";","") 
        Next
        tbl=Split(ret,";")    

        'Формирование записи с именами классов
        '----------------------------------------------------------------------------------
        For i=0 To Ubound(tbl)-1
            hwndChild=Eval(tbl(i))

                'Определение имени класса
                bLen=GetClassNameC.GetClassName(hwndChild,baseAddr,128)
                ClassName=GetDataBSTR(bLen)
                objDocument.writeln(CStr(hwndChild) & vbTAB & "{" & ClassName & "}<BR>")
        Next
        '----------------------------------------------------------------------------------
    End Sub

    
    '*[Возврат строки заданной указателем]
    '------------------------------------------------------------------------------------------
    Function GetDataBSTR(iSize)
        Const CP_ACP=0
        GetDataBSTR=String(iSize,Chr(32))
        pDest=LMActiveX.FuncRun("GetStrPtr",1,GetDataBSTR)
        MultiByteToWideCharC.MultiByteToWideChar CP_ACP,0,baseAddr,-1,pDest,iSize*2+1 
        GetDataBSTR=CStr(GetDataBSTR)
    End Function

Файл EnWndr4.mf:

'------------------------- Модуль LangMF для перечисления дочерних окон ---------------------------------
<#Module=subcls>                                

HwndArr=""                                    
Sub Load(cmdstr)
End Sub
'---------------------------------------------------------------------------------------------------------
Function InitEnum(lHwnd)
    Sys.DynApi.CallFunction "USER32.DLL","EnumChildWindows",CLng(lHwnd),Sys.Callback("WndProcEnum"),0
    InitEnum=HwndArr
End Function
'---------------------------------------------------------------------------------------------------------
Function WndProcEnum(hwndChild,lParam)
    HwndArr=HwndArr & hwndChild & ";"
    InitEnum(hwndChild)
    WndProcEnum=True
End Function

'*[Вспомогательная функция для получения указателя строки]
'---------------------------------------------------------------------------------------------------------
Function GetStrPtr(cStr)
    GetStrPtr=StrPtr(cStr)
End Function                                                

<#Module>

Автор примера - Poltergeyst.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.