1 (изменено: Poltergeyst, 2015-03-05 22:56:08)

Тема: LangMF 9.0 & HTA: Получение характеристик окна под курсором мыши

Без гарантий. Используете на свой страх и риск.

Скрипт предназначен для отслеживания характеристик окна или элемента управления находящегося под курсором мыши. Наведите курсор мыши на интересующий элемент и просмотрите его характеристики во всплывающем окне. Чтобы остановить скрипт,щелкните правой кнопкой мыши по значку в трее и выберите в меню пункт "Стоп"

Сценарий получает следующие характеристики:
Дескриптор окна,
Идентификатор процесса которому принадлежит окно,
Идентификатор главного потока окна,
Класс окна или элемента управления.

Потребуется установленный LangMF 9.0
OC WinXP

LMF9_HTA_Spy.hta


<META HTTP-EQUIV=Content-Type content='text/html;charset=windows-1251'>
<HTML>
<!--
----------------------------------------------------------------------------
 Скрипт предназначен для отслеживания характеристик окна или элемента управления 
 находящегося под курсором мыши. Наведите курсор мыши на интересующий элемент и 
 просмотрите его характеристики во всплывающем окне.Прямоугольная область
 внизу формы отобразит цвет пиксела под курсором.
------------------------------------------------------------------------------
 Чтобы зафиксировать отображение данных:
    1) Активируйте всплывающее HTA-окно скрипта.
    2) Наведите курсор мыши на интересующий вас элемент.
    3) Нажмите Shift+SpaceBar.
    4) При необходимости разрешите скопировать данные в буфер обмена.
------------------------------------------------------------------------------
 Скрипт получает следующие характеристики:
    Текущие координаты курсора
    Дескриптор окна
    Класс окна или элемента управления
    Заголовок окна
    Стиль и расширенный стиль окна
    Идентификатор процесса которому принадлежит окно
    Идентификатор главного потока окна
    Путь к модулю содержащему обработчик сообщений окна
    Цвет пиксела под позицией курсора
------------------------------------------------------------------------------
 Потребуется установленный LangMF 9.0 (http://langmf.ru/ftp/archive/LangMF_9.0/)
 OC WinXP
------------------------------------------------------------------------------
-->

<TITLE>LANG_MF_WINDOW_SPY</TITLE>
<STYLE type=text/css>
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}    
</STYLE>

<HTA:APPLICATION
    ID='LANG_MF_WINDOW_SPY'
    APPLICATIONNAME    ='LANG_MF_WINDOW'    
    SINGLEINSTANCE    ='yes'
    showInTaskBar    ='no'
    MAXIMIZEBUTTON    ='no'
        MINIMIZEBUTTON    ='no'
    SELECTION='no'
        
/>
<BODY SCROLL="NO" style='visibility: hidden;'>
<TABLE ID='WindowData'>
<TR><TD class='c1'>Координата X&nbsp    </TD><TD></TD></TR>
<TR><TD class='c1'>Координата Y&nbsp    </TD><TD></TD></TR>
<TR><TD class='c1'>Дескриптор окна&nbsp    </TD><TD></TD></TR>
<TR><TD class='c1'>Класс окна&nbsp    </TD><TD></TD></TR>
<TR><TD class='c1'>Заголовок окна&nbsp    </TD><TD></TD></TR>
<TR><TD class='c1'>Стиль окна&nbsp    </TD><TD></TD></TR>
<TR><TD class='c1'>Процесс&nbsp        </TD><TD></TD></TR>
<TR><TD class='c1'>Главный поток окна&nbsp</TD><TD></TD></TR>
<TR><TD class='c1'>Имя модуля обработчика&nbsp</TD><TD></TD></TR>
<TR><TD class='c1'>Цвет&nbsp</TD><TD></TD></TR>
<TR>
<TD class='c1' style='height: 40px;'>&nbsp</TD>
<TD style='padding-left: 2em;'><INPUT TYPE='BUTTON' VALUE='Exit' ID='exitButton'></TD>
</TR>
</TABLE>
<PRE ID='LMFCode' style='visibility: hidden;'>
<#Module=LANG_MF_WINDOW_SPY>
'-----------------------------------------------------------------------------
    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

'/Инициализация/
'-----------------------------------------------------------------------------
Sub Load(cmdstr)

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


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

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

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

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

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

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

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


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

    'Получение имени класса
    '----------------------------------------------------------------------
    ClsName = GetClassName(hWnd)    

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

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

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


    'Заполнение таблицы
    '---------------------------------------------------------------------
    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 = "Style: " & hStyle & vbCRLF & "Style Ex: " & hExStyle
        .item(6).cells(1).innerText = PID
        .item(7).cells(1).innerText = hThread
        .item(8).cells(1).innerText = ModPath
    End With
    DoEvents
    '---------------------------------------------------------------------

HWN = hWnd
End Sub

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

    Dim tLen, pDest

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

End Function

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

'/Получение имени модуля/
'-----------------------------------------------------------------------------
Function GetWindowModuleFileName(hWnd)

    GetWindowModuleFileName    = String(LEN_DEFAULT, vbNullChar)

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

End Function

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

    Dim hDC
    hDC = Sys.DynApi.CallFunction( _
                    "USER32.DLL", _
                    "GetWindowDC", _
                    0)
    '--------------------------------------------------------------------
    GetPixelColor = Sys.DynApi.CallFunction( _
                    "GDI32.DLL", _
                    "GetPixel", _
                    hDC, _
                    pX, _
                    pY)

End Function

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

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

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

    Dim iAnsw
    Sys.OffTimer "GetWindowParams"
    Sys.Sleep(100)

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

<SCRIPT Language="JavaScript">
 //-----------------------------------------------------------------------------
    try
    {
        var oLMX = new ActiveXObject('Atomix.LangMF');
    }
    catch(err)
    {
        alert('Установите LangMf 9.0.'); 
        window.close();
    }

    tlb = document.getElementById("WindowData");

 //-----------------------------------------------------------------------------
 function window.onload()
 {
    oLMX.Command(LMFCode.innerText);
    oLMX.Script.AddObject("TABLE", tlb);    
    window.resizeTo(tlb.clientWidth, tlb.clientHeight + 70);
    window.document.body.style.visibility = 'visible';
 }
 //-----------------------------------------------------------------------------
 function document.onkeypress()
 {
    window.scroll(0,0);
    window.scroll(0,0);
    window.scroll(0,0);
 if (event.shiftKey){if (event.keyCode==32){oLMX.FuncRun('FreezeWindow',1);}}
 }
 //-----------------------------------------------------------------------------
 function window.onunload()
 {
    LMX.Reset();
    oLMX = null;
 }
 //-----------------------------------------------------------------------------
 function exitButton.onclick()
 {
     window.close();
 }
</SCRIPT>
</BODY>
</HTML>