<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; LangMF 9.0 & HTA: Получение характеристик окна под курсором мыши]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=2519&amp;type=atom" />
	<updated>2008-11-30T21:48:26Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=2519</id>
		<entry>
			<title type="html"><![CDATA[LangMF 9.0 & HTA: Получение характеристик окна под курсором мыши]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=16431#p16431" />
			<content type="html"><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск</em>.</p><p>Скрипт предназначен для отслеживания характеристик окна или элемента управления находящегося под курсором мыши. Наведите курсор мыши на интересующий элемент и просмотрите его характеристики во всплывающем окне. Чтобы остановить скрипт,щелкните правой кнопкой мыши по значку в трее и выберите в меню пункт &quot;Стоп&quot;</p><p>Сценарий получает следующие характеристики:<br />	Дескриптор окна,<br />	Идентификатор процесса которому принадлежит окно,<br />	Идентификатор главного потока окна,<br />	Класс окна или элемента управления.</p><p>Потребуется установленный <a href="http://langmf.ru/ftp/archive/LangMF_9.0/">LangMF 9.0</a><br />OC WinXP</p><p><strong>LMF9_HTA_Spy.hta</strong><br /></p><div class="codebox"><pre><code>
&lt;META HTTP-EQUIV=Content-Type content=&#039;text/html;charset=windows-1251&#039;&gt;
&lt;HTML&gt;
&lt;!--
----------------------------------------------------------------------------
 Скрипт предназначен для отслеживания характеристик окна или элемента управления 
 находящегося под курсором мыши. Наведите курсор мыши на интересующий элемент и 
 просмотрите его характеристики во всплывающем окне.Прямоугольная область
 внизу формы отобразит цвет пиксела под курсором.
------------------------------------------------------------------------------
 Чтобы зафиксировать отображение данных:
    1) Активируйте всплывающее HTA-окно скрипта.
    2) Наведите курсор мыши на интересующий вас элемент.
    3) Нажмите Shift+SpaceBar.
    4) При необходимости разрешите скопировать данные в буфер обмена.
------------------------------------------------------------------------------
 Скрипт получает следующие характеристики:
    Текущие координаты курсора
    Дескриптор окна
    Класс окна или элемента управления
    Заголовок окна
    Стиль и расширенный стиль окна
    Идентификатор процесса которому принадлежит окно
    Идентификатор главного потока окна
    Путь к модулю содержащему обработчик сообщений окна
    Цвет пиксела под позицией курсора
------------------------------------------------------------------------------
 Потребуется установленный LangMF 9.0 (http://langmf.ru/ftp/archive/LangMF_9.0/)
 OC WinXP
------------------------------------------------------------------------------
--&gt;

&lt;TITLE&gt;LANG_MF_WINDOW_SPY&lt;/TITLE&gt;
&lt;STYLE type=text/css&gt;
BODY    {background-color: #dcb18f; border: 5px; border-style: outset; margin: 0;}
TD    {    width: 300px; 
        height: 20; 
        font-family: Verdana; 
        font-size: 12px; 
        font-weight: 700; 
        background-color: white; 
        border-style: solid; 
        border-width: 1px; 
        border-color: black;
        padding: 0px; 
        align: left;}
TD.c1    {width: 45px; align: left;}
INPUT    {border: 1px solid blue; width: 90}    
&lt;/STYLE&gt;

&lt;HTA:APPLICATION
    ID=&#039;LANG_MF_WINDOW_SPY&#039;
    APPLICATIONNAME    =&#039;LANG_MF_WINDOW&#039;    
    SINGLEINSTANCE    =&#039;yes&#039;
    showInTaskBar    =&#039;no&#039;
    MAXIMIZEBUTTON    =&#039;no&#039;
        MINIMIZEBUTTON    =&#039;no&#039;
    SELECTION=&#039;no&#039;
        
/&gt;
&lt;BODY SCROLL=&quot;NO&quot; style=&#039;visibility: hidden;&#039;&gt;
&lt;TABLE ID=&#039;WindowData&#039;&gt;
&lt;TR&gt;&lt;TD class=&#039;c1&#039;&gt;Координата X&amp;nbsp    &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;&lt;TD class=&#039;c1&#039;&gt;Координата Y&amp;nbsp    &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;&lt;TD class=&#039;c1&#039;&gt;Дескриптор окна&amp;nbsp    &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;&lt;TD class=&#039;c1&#039;&gt;Класс окна&amp;nbsp    &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;&lt;TD class=&#039;c1&#039;&gt;Заголовок окна&amp;nbsp    &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;&lt;TD class=&#039;c1&#039;&gt;Стиль окна&amp;nbsp    &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;&lt;TD class=&#039;c1&#039;&gt;Процесс&amp;nbsp        &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;&lt;TD class=&#039;c1&#039;&gt;Главный поток окна&amp;nbsp&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;&lt;TD class=&#039;c1&#039;&gt;Имя модуля обработчика&amp;nbsp&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;&lt;TD class=&#039;c1&#039;&gt;Цвет&amp;nbsp&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class=&#039;c1&#039; style=&#039;height: 40px;&#039;&gt;&amp;nbsp&lt;/TD&gt;
&lt;TD style=&#039;padding-left: 2em;&#039;&gt;&lt;INPUT TYPE=&#039;BUTTON&#039; VALUE=&#039;Exit&#039; ID=&#039;exitButton&#039;&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TABLE&gt;
&lt;PRE ID=&#039;LMFCode&#039; style=&#039;visibility: hidden;&#039;&gt;
&lt;#Module=LANG_MF_WINDOW_SPY&gt;
&#039;-----------------------------------------------------------------------------
    Public HWN, hWnd
    Public TABLE
    Public pPOINT, pPROCESSID
    Public hStyle, hExStyle

    Public Const GWL_STYLE    = -16
    Public Const GWL_EXSTYLE = -20
    Public Const LEN_DEFAULT = 256

&#039;/Инициализация/
&#039;-----------------------------------------------------------------------------
Sub Load(cmdstr)

    &#039;Определение дескриптора окна HTA
    &#039;---------------------------------------------------------------------
    hWnd = Sys.DynApi.CallFunction( &quot;USER32.DLL&quot;, _
                    &quot;FindWindowA&quot;, _
                    0, _
                    &quot;LANG_MF_WINDOW_SPY&quot;)


    &#039;Установка окна HTA в положение TOPMOST
    &#039;---------------------------------------------------------------------
    Sys.DynApi.CallFunction &quot;USER32.DLL&quot;, _
                    &quot;SetWindowPos&quot;, _
                    hWnd, _
                    -1, _
                    10, _
                    10, _
                    500, _
                    500,0
    
    &#039;Установка буфера для структуры pPOINT
    &#039;---------------------------------------------------------------------
    Sys.DynAPI.CurBuf = 0
    Sys.DynAPI.ReBuf(16)
    pPOINT = Sys.DynAPI.PtrBuf(0)
    
    &#039;Установка буфера для структуры pPROCESSID
    &#039;---------------------------------------------------------------------
    Sys.DynAPI.CurBuf = 1
    Sys.DynAPI.ReBuf(8)
    pPROCESSID = Sys.DynAPI.PtrBuf(1)
    &#039;---------------------------------------------------------------------
    HWN = 0    &#039;Дескриптор предыдущего окна
    Sys.Sleep(100)
    Sys.OnTimer 100,&quot;GetWindowParams&quot;
End Sub

&#039;/Получение параметров окна/
&#039;-----------------------------------------------------------------------------
Sub GetWindowParams()

    Dim ClsName
    Dim Title
    Dim hStyle
    Dim hExStyle
    Dim hThread    
    Dim ModPath

    &#039;---------------------------------------------------------------------
    TABLE.setActive()    &#039;Элемент HTA-документа постоянно активируется!
    
    &#039;Получение позиции курсора мыши    
    &#039;---------------------------------------------------------------------
    fRes = Sys.DynApi.CallFunction(&quot;USER32.DLL&quot;,&quot;GetCursorPos&quot;, pPOINT)
    pX = GetDataDWORD(pPOINT,4,0)
    pY = GetDataDWORD(pPOINT,4,4)

    &#039;Получение дескриптора окна или элемента управления под курсором
    &#039;---------------------------------------------------------------------
    hWnd = Sys.DynApi.CallFunction( _
                    &quot;USER32.DLL&quot;, _
                    &quot;WindowFromPoint&quot;, _
                    pX, _
                    pY)

    &#039;Получение цвета пиксела под курсором
    &#039;---------------------------------------------------------------------
    hColor = GetPixelColor(pX, pY)
    Sys.Conv.Long4Byte hColor, b1, b2, b3, b4
    hColor = Sys.Conv.Byte4Long(0, b4, b3, b2)

    &#039;Установка цвета HTML элемента
    &#039;---------------------------------------------------------------------
    TABLE.rows(10).cells(0).style.backgroundColor = rgb(b2, b3, b4)        
    DoEvents
    
    &#039;Заполнение таблицы
    &#039;---------------------------------------------------------------------
    With TABLE.rows
        .item(0).cells(1).innerText = pX
        .item(1).cells(1).innerText = pY
        .item(9).cells(1).innerText= _
        &quot;H:&quot; &amp; Hex(hColor) &amp; vbCRLF &amp; &quot;RGB:&quot; &amp; &quot;r&quot; &amp; b4 &amp; &quot;g&quot; &amp; b3 &amp; &quot;b&quot; &amp; b2
    End With
    DoEvents


    &#039;/Обработка данных нового окна под курсором/
    &#039;----------------------------------------------------------------------
    &#039;----------------------------------------------------------------------
    If hWnd = HWN Then Exit Sub
    

    &#039;Получение имени класса
    &#039;----------------------------------------------------------------------
    ClsName = GetClassName(hWnd)    

    &#039;Получение заголовка окна
    &#039;----------------------------------------------------------------------
    Title = GetWindowText(hWnd)
    
    &#039;Получение стилей окна
    &#039;----------------------------------------------------------------------
    hStyle = Sys.DynApi.CallFunction( _
                    &quot;USER32.DLL&quot;, _
                    &quot;GetWindowLongA&quot;, _
                    hWnd, _
                    GWL_STYLE)
    &#039;----------------------------------------------------------------------
    hExStyle = Sys.DynApi.CallFunction( _
                    &quot;USER32.DLL&quot;, _
                    &quot;GetWindowLongA&quot;, _
                    hWnd, _
                    GWL_EXSTYLE)

    &#039;Получение идентификатора процесса и главного потока окна
    &#039;----------------------------------------------------------------------
    hThread    = Sys.DynApi.CallFunction( _
                    &quot;USER32.DLL&quot;, _
                    &quot;GetWindowThreadProcessId&quot;, _
                    hWnd, _
                    pPROCESSID)
    PID = GetDataDWORD(pPROCESSID, 4, 0)

    &#039;Получение имени модуля процесса окна
    &#039;----------------------------------------------------------------------
    ModPath = GetWindowModuleFileName(hWnd)    


    &#039;Заполнение таблицы
    &#039;---------------------------------------------------------------------
    With TABLE.rows
        .item(2).cells(1).innerText = hWnd
        .item(3).cells(1).innerText = ClsName
        .item(4).cells(1).innerText = Title
        .item(5).cells(1).innerText = &quot;Style: &quot; &amp; hStyle &amp; vbCRLF &amp; &quot;Style Ex: &quot; &amp; hExStyle
        .item(6).cells(1).innerText = PID
        .item(7).cells(1).innerText = hThread
        .item(8).cells(1).innerText = ModPath
    End With
    DoEvents
    &#039;---------------------------------------------------------------------

HWN = hWnd
End Sub

&#039;/Получение заголовка окна/
&#039;-----------------------------------------------------------------------------
Function GetWindowText(hWnd)

    Dim tLen, pDest

    &#039;Получение длины заголовка
    &#039;---------------------------------------------------------------------
    tLen = Sys.DynApi.CallFunction( _
                    &quot;USER32.DLL&quot;, _
                    &quot;GetWindowTextLengthW&quot;, _
                    hWnd)
    If tLen = 0 Then
        GetWindowText = &quot;{Неопределено}&quot;
        Exit Function
    End If
    
    &#039;Получение заголовка
    &#039;---------------------------------------------------------------------
    GetWindowText = String(2*tLen+1, vbNullChar)
    fRes = Sys.DynApi.CallFunction( _
                    &quot;USER32.DLL&quot;, _
                    &quot;GetWindowTextW&quot;, _
                    hWnd, _
                    Sys.StrPtr(GetWindowText), _
                    2*tLen+1)    

End Function

&#039;/Получение класса окна/
&#039;-----------------------------------------------------------------------------
Function GetClassName(hWnd)
    
    GetClassName = String(LEN_DEFAULT, vbNullChar)
    bLen = Sys.DynApi.CallFunction( _
                    &quot;USER32.DLL&quot;, _
                    &quot;GetClassNameW&quot;, _
                    hWnd, _
                    Sys.StrPtr(GetClassName), _
                    LEN_DEFAULT)
        
End Function

&#039;/Получение имени модуля/
&#039;-----------------------------------------------------------------------------
Function GetWindowModuleFileName(hWnd)

    GetWindowModuleFileName    = String(LEN_DEFAULT, vbNullChar)

    fRes = Sys.DynApi.CallFunction( _
                    &quot;USER32.DLL&quot;, _
                    &quot;GetWindowModuleFileNameW&quot;, _
                    hWnd, _
                    Sys.StrPtr(GetWindowModuleFileName), _
                    LEN_DEFAULT)

End Function

&#039;/Получение цвета текущего пиксела/
&#039;-----------------------------------------------------------------------------
Function GetPixelColor(pX,pY)

    Dim hDC
    hDC = Sys.DynApi.CallFunction( _
                    &quot;USER32.DLL&quot;, _
                    &quot;GetWindowDC&quot;, _
                    0)
    &#039;--------------------------------------------------------------------
    GetPixelColor = Sys.DynApi.CallFunction( _
                    &quot;GDI32.DLL&quot;, _
                    &quot;GetPixel&quot;, _
                    hDC, _
                    pX, _
                    pY)

End Function

&#039;/Чтение DWORD данных структуры/
&#039;-----------------------------------------------------------------------------
Function GetDataDWORD(lpData,iSize,iOffset)

    Dim pDest, tdOffset
    GetDataDWORD=CLng(0)
    pDest=Sys.VarPtr(GetDataDWORD)
    Sys.DynAPI.CallFunction &quot;KERNEL32.DLL&quot;,&quot;RtlMoveMemory&quot;, pDest+8, lpData + iOffset, iSize
End Function 

&#039;/Фиксация отображения данных/
&#039;-----------------------------------------------------------------------------
Sub FreezeWindow()

    Dim iAnsw
    Sys.OffTimer &quot;GetWindowParams&quot;
    Sys.Sleep(100)

    iAnsw = MsgBox(&quot;Отображение заморожено.Не закрывая этого сообщения просмотрите данные.&quot; &amp; vbCRLF &amp; _
            &quot;P.S.:Копировать информацию в буфер обмена?&quot;, _
            vbExclamation + vbSystemModal + vbYesNo, _    
            &quot;Freeze&quot;)
    
    If iAnsw = vbYes Then Sys.ClipBoard.SetText CStr(TABLE.innerText), 1
    DoEvents
    Sys.Sleep(100)
    Sys.OnTimer 100,&quot;GetWindowParams&quot;
End Sub
&#039;-----------------------------------------------------------------------------
&lt;#Module&gt;
&lt;/PRE&gt;

&lt;SCRIPT Language=&quot;JavaScript&quot;&gt;
 //-----------------------------------------------------------------------------
    try
    {
        var oLMX = new ActiveXObject(&#039;Atomix.LangMF&#039;);
    }
    catch(err)
    {
        alert(&#039;Установите LangMf 9.0.&#039;); 
        window.close();
    }

    tlb = document.getElementById(&quot;WindowData&quot;);

 //-----------------------------------------------------------------------------
 function window.onload()
 {
    oLMX.Command(LMFCode.innerText);
    oLMX.Script.AddObject(&quot;TABLE&quot;, tlb);    
    window.resizeTo(tlb.clientWidth, tlb.clientHeight + 70);
    window.document.body.style.visibility = &#039;visible&#039;;
 }
 //-----------------------------------------------------------------------------
 function document.onkeypress()
 {
    window.scroll(0,0);
    window.scroll(0,0);
    window.scroll(0,0);
 if (event.shiftKey){if (event.keyCode==32){oLMX.FuncRun(&#039;FreezeWindow&#039;,1);}}
 }
 //-----------------------------------------------------------------------------
 function window.onunload()
 {
    LMX.Reset();
    oLMX = null;
 }
 //-----------------------------------------------------------------------------
 function exitButton.onclick()
 {
     window.close();
 }
&lt;/SCRIPT&gt;
&lt;/BODY&gt;
&lt;/HTML&gt;
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Poltergeyst]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=83</uri>
			</author>
			<updated>2008-11-30T21:48:26Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=16431#p16431</id>
		</entry>
</feed>
