Тема: 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.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.