<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBScript: перечисление дочерних окон (дескрипторы и имена классов)]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=1500</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=1500&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBScript: перечисление дочерних окон (дескрипторы и имена классов)».]]></description>
		<lastBuildDate>Sat, 31 May 2008 05:50:02 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBScript: перечисление дочерних окон (дескрипторы и имена классов)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=11147#p11147</link>
			<description><![CDATA[<p>Тот же пример, но код LangMF вынесен в отдельный файл.<br /></p><div class="codebox"><pre><code>    &#039;------------------------------------------------------------------------------------------
    &#039;Скрипт предназначен для перечисления дочерних окон интерфейса Internet Explorer
    &#039;с получением дескриптора и имени класса каждого из них.
    &#039;------------------------------------------------------------------------------------------
    &#039;Language:            VBScript
    &#039;Используется             библиотека dynwrap.dll
    &#039;Используется              библиотека LangMF.dll,7.7.0.0 или установленный LangMF 7.7
    
    Dim ieHWND    
    Dim Dict

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

    &#039;Создание экземпляра окна Internet Explorer
    &#039;------------------------------------------------------------------------------------------
    Set objIE    =CreateObject(&quot;InternetExplorer.Application&quot;)

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

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

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

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

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

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

                &#039;Определение имени класса
                bLen=GetClassNameC.GetClassName(hwndChild,baseAddr,128)
                ClassName=GetDataBSTR(bLen)
                objDocument.writeln(CStr(hwndChild) &amp; vbTAB &amp; &quot;{&quot; &amp; ClassName &amp; &quot;}&lt;BR&gt;&quot;)
        Next
        &#039;----------------------------------------------------------------------------------
    End Sub

    
    &#039;*[Возврат строки заданной указателем]
    &#039;------------------------------------------------------------------------------------------
    Function GetDataBSTR(iSize)
        Const CP_ACP=0
        GetDataBSTR=String(iSize,Chr(32))
        pDest=LMActiveX.FuncRun(&quot;GetStrPtr&quot;,1,GetDataBSTR)
        MultiByteToWideCharC.MultiByteToWideChar CP_ACP,0,baseAddr,-1,pDest,iSize*2+1 
        GetDataBSTR=CStr(GetDataBSTR)
    End Function</code></pre></div><p>Файл <strong>EnWndr4.mf</strong>:<br /></p><div class="codebox"><pre><code>&#039;------------------------- Модуль LangMF для перечисления дочерних окон ---------------------------------
&lt;#Module=subcls&gt;                                

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

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

&lt;#Module&gt;</code></pre></div><p>Автор примера - <strong>Poltergeyst</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Sat, 31 May 2008 05:50:02 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=11147#p11147</guid>
		</item>
		<item>
			<title><![CDATA[VBScript: перечисление дочерних окон (дескрипторы и имена классов)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=11146#p11146</link>
			<description><![CDATA[<p>Пример перечисляет дочерние окна интерфейса Internet Explorer с получением дескриптора и имени класса каждого из них, результаты выводятся в само окно Internet Explorer.<br />Потребуется библиотека <a href="http://www.script-coding.com/dynwrap.html">dynwrap.dll</a> и установленный <a href="http://www.script-coding.com/LangMF.html">LangMF 7.7</a>.<br /></p><div class="codebox"><pre><code>    &#039;------------------------------------------------------------------------------------------
    &#039;Скрипт предназначен для перечисления дочерних окон интерфейса Internet Explorer
    &#039;с получением дескриптора и имени класса каждого из них.
    &#039;------------------------------------------------------------------------------------------
    &#039;Language:            VBScript
    &#039;Используется             библиотека dynwrap.dll
    &#039;Используется              библиотека LangMF.dll,7.7.0.0 или установленный LangMF 7.7
    
    Dim ieHWND    
    Dim Dict

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

    &#039;Создание экземпляра окна Internet Explorer
    &#039;------------------------------------------------------------------------------------------
    Set objIE    =CreateObject(&quot;InternetExplorer.Application&quot;)

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

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

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

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

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

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

                &#039;Определение имени класса
                bLen=GetClassNameC.GetClassName(hwndChild,baseAddr,128)
                ClassName=GetDataBSTR(bLen)
                objDocument.writeln(CStr(hwndChild) &amp; vbTAB &amp; &quot;{&quot; &amp; ClassName &amp; &quot;}&lt;BR&gt;&quot;)
        Next
        &#039;----------------------------------------------------------------------------------
    End Sub

    
    &#039;*[Возврат строки заданной указателем]
    &#039;------------------------------------------------------------------------------------------
    Function GetDataBSTR(iSize)
        Const CP_ACP=0
        GetDataBSTR=String(iSize,Chr(32))
        pDest=LMActiveX.FuncRun(&quot;GetStrPtr&quot;,1,GetDataBSTR)
        MultiByteToWideCharC.MultiByteToWideChar CP_ACP,0,baseAddr,-1,pDest,iSize*2+1 
        GetDataBSTR=CStr(GetDataBSTR)
    End Function</code></pre></div><p>Автор примера - <strong>Poltergeyst</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Sat, 31 May 2008 05:46:21 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=11146#p11146</guid>
		</item>
	</channel>
</rss>
