Тема: 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  </TD><TD></TD></TR>
<TR><TD class='c1'>Координата Y  </TD><TD></TD></TR>
<TR><TD class='c1'>Дескриптор окна  </TD><TD></TD></TR>
<TR><TD class='c1'>Класс окна  </TD><TD></TD></TR>
<TR><TD class='c1'>Заголовок окна  </TD><TD></TD></TR>
<TR><TD class='c1'>Стиль окна  </TD><TD></TD></TR>
<TR><TD class='c1'>Процесс  </TD><TD></TD></TR>
<TR><TD class='c1'>Главный поток окна </TD><TD></TD></TR>
<TR><TD class='c1'>Имя модуля обработчика </TD><TD></TD></TR>
<TR><TD class='c1'>Цвет </TD><TD></TD></TR>
<TR>
<TD class='c1' style='height: 40px;'> </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>