<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBScript: использование структур RECT и POINT в Win32 API]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=1413</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=1413&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBScript: использование структур RECT и POINT в Win32 API».]]></description>
		<lastBuildDate>Sun, 04 May 2008 18:51:00 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBScript: использование структур RECT и POINT в Win32 API]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=10734#p10734</link>
			<description><![CDATA[<p>Также можно организовать скрипт,оределяющий размеры BITMAP <br />изображения,что может оказаться полезным,например,при работе<br />с элементом ImageList.</p><div class="codebox"><pre><code>&#039;---------------------------------------------------------------------------
&#039;------ Нет гарантий!Используете на свой страх и риск ------------
&#039;---------------------------------------------------------------------------
&#039;Использование структуры BITMAP для определения размеров
&#039;точечного рисунка (*.BMP)
&#039;---------------------------------------------------------------------------
&#039;Language:            VBScript
&#039;Используется             библиотека dynwrap.dll
&#039;---------------------------------------------------------------------------
&#039;ОС Win98 4.10.2222
&#039;---------------------------------------------------------------------------


&#039;------------------ Создание класса -----------------------------------
Class StructRestr
&#039;---------------------------------------------------------------------------
    Private     RtlMoveMemory_Call, _
            lstrcat_Call, _
            HeapAlloc_Call, _
            GetProcessHeap_Call, _
            HeapFree_Call
    Private     hHeap,init
&#039;---------------------------------------------------------------------------
Private Sub Class_Initialize    &#039;Запуск класса

&#039;---------------------------------------------------------------------------
Set RtlMoveMemory_Call        =CreateObject(&quot;DynamicWrapper&quot;)
RtlMoveMemory_Call.Register     &quot;KERNEL32.DLL&quot;,&quot;RtlMoveMemory&quot;,&quot;f=s&quot;,&quot;i=lll&quot;,&quot;r=l&quot;
&#039;---------------------------------------------------------------------------
Set lstrcat_Call        =CreateObject(&quot;DynamicWrapper&quot;)
lstrcat_Call.Register         &quot;KERNEL32.DLL&quot;,&quot;lstrcat&quot;,&quot;f=s&quot;,&quot;i=ws&quot;,&quot;r=l&quot; 
&#039;---------------------------------------------------------------------------
Set HeapAlloc_Call    =CreateObject(&quot;DynamicWrapper&quot;)
HeapAlloc_Call.Register     &quot;KERNEL32.DLL&quot;,&quot;HeapAlloc&quot;,&quot;f=s&quot;,&quot;i=lll&quot;,&quot;r=l&quot;
&#039;---------------------------------------------------------------------------
Set GetProcessHeap_Call    =CreateObject(&quot;DynamicWrapper&quot;)
GetProcessHeap_Call.Register    &quot;KERNEL32.DLL&quot;,&quot;GetProcessHeap&quot;,&quot;f=s&quot;,&quot;r=l&quot;
&#039;---------------------------------------------------------------------------
Set HeapFree_Call        =CreateObject(&quot;DynamicWrapper&quot;)
HeapFree_Call.Register        &quot;KERNEL32.DLL&quot;,&quot;HeapFree&quot;,&quot;f=s&quot;,&quot;i=lll&quot;,&quot;r=l&quot;
&#039;---------------------------------------------------------------------------
&#039;Локализация кучи
hHeap=GetProcessHeap_Call.GetProcessHeap()
End Sub 

&#039;---------------------------------------------------------------------------
Private Sub Class_Terminate    &#039;Уничтожение класса
    HeapFree_Call.HeapFree hHeap,0,init
End Sub
&#039;---------------------------------------------------------------------------
&#039;[Инициализация структуры]    
    Public Sub initStruct(structSize)
        &#039;Локализация структуры
        init=HeapAlloc_Call.HeapAlloc(hHeap,0,structSize)
    End Sub
&#039;---------------------------------------------------------------------------
&#039;[Возврат базового адреса]
    Public Property Get baseAddr
        &#039;Базовый адрес
        baseAddr=init
    End Property
&#039;---------------------------------------------------------------------------
&#039;*[Извлечение данных структуры]
    Public Function GetDataDWORD(lpData,iOffset)
        Dim pDest,tdOffset
        pDest=lstrcat_Call.lstrcat(GetDataDWORD,&quot;&quot;)
        GetDataDWORD=CLng(0)
        RtlMoveMemory_Call.RtlMovememory pDest+8,lpData+iOffset,4 
    End Function 
End Class
&#039;---------------------------------------------------------------------------
&#039;--------- Определение размера точечного изображения ---------
&#039;---------------------------------------------------------------------------
Function GetBitmapDimension()

const LR_LOADFROMFILE        =16
const IMAGE_BITMAP        =0

path=&quot;C:\...\...\image.bmp&quot;
&#039;---------------------------------------------------------------------------
&#039;Инициализация структуры BITMAP    
    Set BITMAP=new StructRestr
    BITMAP.initStruct(22)
&#039;---------------------------------------------------------------------------
&#039;Загрузка изображения и определение его размеров
Set LoadImageA_Call=CreateObject(&quot;DynamicWrapper&quot;)
LoadImageA_Call.Register &quot;USER32.DLL&quot;,&quot;LoadImageA&quot;,&quot;i=lsllll&quot;,&quot;f=s&quot;,&quot;r=l&quot;
hBitmap=LoadImageA_Call.LoadImageA(0,CStr(path),IMAGE_BITMAP, _
0,0,LR_LOADFROMFILE)
Set LoadImageA_Call=Nothing
&#039;---------------------------------------------------------------------------
Set GetObj_Call    =CreateObject(&quot;DynamicWrapper&quot;)
GetObj_Call.Register &quot;GDI32.DLL&quot;,&quot;GetObjectA&quot;,&quot;i=lll&quot;,&quot;f=s&quot;,&quot;r=l&quot;
GetObj_Call.GetObjectA CLng(hBitmap),CLng(22),CLng(BITMAP.baseAddr)
Set GetObj_Call=Nothing
&#039;---------------------------------------------------------------------------
    bWidth    =BITMAP.GetDataDWORD(BITMAP.baseAddr,4)
    bHeight    =BITMAP.GetDataDWORD(BITMAP.baseAddr,8)
&#039;---------------------------------------------------------------------------
Set BITMAP=Nothing
WScript.Echo    &quot;Размеры изображения&quot;     &amp; vbCR &amp; _
        &quot;[&quot; &amp; path &amp; &quot;]&quot;     &amp; vbCR &amp; _
        bWidth &amp; &quot; X &quot; &amp; bHeight 
&#039;---------------------------------------------------------------------------
End Function
&#039;---------------------------------------------------------------------------
GetBitmapDimension()</code></pre></div><p>Осталось отметить,что при создании этих скриптов использовалась <br />несколько переделанная технология представленная в этом примере:</p><p><a href="http://www.visualbasicscript.com/m_47471/mpage_1/tm.htm#47471">http://www.visualbasicscript.com/m_4747 … .htm#47471</a></p><p>Разница в том,что в примере по вышеуказанной ссылке,память под<br />структуру выделяется динамически,т.е для доведения структуры<br />до заданного размера,её надо заполнять нулями,в отличие от <br />вышеуказанных листингов,где структура заданного размера<br />жестко локализуется в системной куче текущего процесса.</p>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Sun, 04 May 2008 18:51:00 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=10734#p10734</guid>
		</item>
		<item>
			<title><![CDATA[VBScript: использование структур RECT и POINT в Win32 API]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=10722#p10722</link>
			<description><![CDATA[<p>Пример демонстрирует использование структур RECT и POINT на примере закрашивания произвольной области окна и отслеживания координат курсора мыши.<br />Потребуются библиотеки <a href="http://www.script-coding.com/dynwrap.html">dynwrap.dll</a> и <a href="http://www.script-coding.com/AutiItX.html">AutoItX3.dll</a>.<br /></p><div class="codebox"><pre><code>&#039;------ Нет гарантий!Используете на свой страх и риск ------------
&#039;-----------------------------------------------------------------
&#039;Использование структур RECT и POINT на примере закрашивания 
&#039;произвольной области окна и отслеживания координат курсора мыши.
&#039;-----------------------------------------------------------------
&#039;Language:            VBScript
&#039;Используется             библиотека dynwrap.dll
&#039;Используется вспомогательная     библиотека AutoItX3.dll,v3.2.0.1
&#039;-----------------------------------------------------------------
&#039;ОС Win98 4.10.2222
&#039;-----------------------------------------------------------------


Set aX3        =WScript.CreateObject(&quot;AutoItX3.Control&quot;)    &#039;Вспомогательный объект

&#039;--------------------------------- Создание класса ---------------------------------------
Class Struct    
&#039;-----------------------------------------------------------------------------------------
    Private     RtlMoveMemory_Call, _
            lstrcat_Call, _
            HeapAlloc_Call, _
            GetProcessHeap_Call, _
            HeapFree_Call
    Private     hHeap,init
&#039;-----------------------------------------------------------------------------------------
    Public         iOfs 
&#039;-----------------------------------------------------------------------------------------
Private Sub Class_Initialize    &#039;Запуск класса

    &#039;---------------------------------------------------------------------------------
    Set RtlMoveMemory_Call        =CreateObject(&quot;DynamicWrapper&quot;)
    RtlMoveMemory_Call.Register &quot;kernel32.dll&quot;,&quot;RtlMoveMemory&quot;,&quot;f=s&quot;,&quot;i=lll&quot;,&quot;r=l&quot;
    &#039;---------------------------------------------------------------------------------
    Set lstrcat_Call        =CreateObject(&quot;DynamicWrapper&quot;)
    lstrcat_Call.Register &quot;kernel32.dll&quot;,&quot;lstrcat&quot;,&quot;f=s&quot;,&quot;i=ws&quot;,&quot;r=l&quot; 
    &#039;---------------------------------------------------------------------------------
    Set HeapAlloc_Call        =CreateObject(&quot;DynamicWrapper&quot;)
    HeapAlloc_Call.Register     &quot;KERNEL32.DLL&quot;,&quot;HeapAlloc&quot;,&quot;f=s&quot;,&quot;i=lll&quot;,&quot;r=l&quot;
    &#039;---------------------------------------------------------------------------------
    Set GetProcessHeap_Call        =CreateObject(&quot;DynamicWrapper&quot;)
    GetProcessHeap_Call.Register    &quot;KERNEL32.DLL&quot;,&quot;GetProcessHeap&quot;,&quot;f=s&quot;,&quot;r=l&quot;
    &#039;---------------------------------------------------------------------------------
    Set HeapFree_Call        =CreateObject(&quot;DynamicWrapper&quot;)
    HeapFree_Call.Register        &quot;KERNEL32.DLL&quot;,&quot;HeapFree&quot;,&quot;f=s&quot;,&quot;i=lll&quot;,&quot;r=l&quot;
    &#039;---------------------------------------------------------------------------------
    &#039;Локализация кучи
    hHeap=GetProcessHeap_Call.GetProcessHeap()
End Sub 

&#039;-----------------------------------------------------------------------------------------
Private Sub Class_Terminate    &#039;Уничтожение класса
    HeapFree_Call.HeapFree hHeap,0,init
End Sub
&#039;-----------------------------------------------------------------------------------------
&#039;-----------------------------------------------------------------------------------------
&#039;[Инициализация структуры]    
    Public Sub initStruct(structSize)
        &#039;Локализация структуры
        init=HeapAlloc_Call.HeapAlloc(hHeap,0,structSize)
    End Sub
&#039;-----------------------------------------------------------------------------------------
&#039;[Возврат базового адреса]
    Public Property Get baseAddr
        &#039;Базовый адрес
        baseAddr=init
    End Property
&#039;-----------------------------------------------------------------------------------------
&#039;*[Добавление данных в структуру]
    Public Function SetDataDWORD(ptr,iSize,Data)
        Dim lW,hW,ConvertedData
            hW=Fix(Data/65536)
            lW=Data mod 65536 
            ConvertedData=ChrW(lW) &amp; ChrW(hW) 
        RtlMoveMemory_Call.RtlMovememory ptr+iOfs,GetBSTRPtr(ConvertedData),iSize
        iOfs=iOfs+iSize 
    End Function
&#039;-----------------------------------------------------------------------------------------
&#039;*[Извлечение данных структуры]
    Public Function GetDataDWORD(lpData,iSize,iOffset)
        Dim pDest,tdOffset
        pDest=lstrcat_Call.lstrcat(GetDataDWORD,&quot;&quot;)
        GetDataDWORD=CLng(0)
        RtlMoveMemory_Call.RtlMovememory pDest+8,lpData+iOffset,iSize 
    End Function 
&#039;-----------------------------------------------------------------------------------------
&#039;*[Получение локального указателя добавляемых данных]
    Public Function GetBSTRPtr(ByRef sData)
        Dim pSource 
        Dim pDest
            pSource=lstrcat_Call.lstrcat(sData,&quot;&quot;)
            pDest=lstrcat_Call.lstrcat(GetBSTRPtr,&quot;&quot;)
            GetBSTRPtr=CLng(GetBSTRPtr)
        RtlMoveMemory_Call.RtlMovememory pDest+8,pSource+8,4
    End Function
&#039;-----------------------------------------------------------------------------------------
End Class

&#039;-----------------------------------------------------------------------------------------
&#039;----------- Закрашивание заданного прямоугольника в области заданного окна --------------
&#039;-----------------------------------------------------------------------------------------
Function paintRect()
    Set wShell    =WScript.CreateObject(&quot;WScript.Shell&quot;)
    &#039;---------------------------------------------------------------------------------
    wShell.Run &quot;NOTEPAD.EXE&quot;,3,0
    ax3.Sleep(500)
    &#039;---------------------------------------------------------------------------------
    &#039;Заполнение структуры

        iOfs=0
        Set RECT=new Struct
        RECT.initStruct(16)

            RECT.SetDataDWORD RECT.baseAddr,4,100
            RECT.SetDataDWORD RECT.baseAddr,4,100
            RECT.SetDataDWORD RECT.baseAddr,4,400
            RECT.SetDataDWORD RECT.baseAddr,4,400
    ax3.Sleep(500)
    &#039;---------------------------------------------------------------------------------
    &#039;Закрашивание произвольной области окна

    Set GetForegroundWindow_Call    =CreateObject(&quot;DynamicWrapper&quot;)
    GetForegroundWindow_Call.Register &quot;USER32.DLL&quot;,&quot;GetForegroundWindow&quot;,&quot;f=s&quot;,&quot;r=h&quot;
    hwnd=GetForegroundWindow_Call.GetForegroundWindow()
    Set GetForegroundWindow_Call=Nothing
    &#039;---------------------------------------------------------------------------------
    Set GetWindowDC_Call        =CreateObject(&quot;DynamicWrapper&quot;)
    GetWindowDC_Call.Register &quot;USER32.DLL&quot;,&quot;GetWindowDC&quot;,&quot;i=h&quot;,&quot;f=s&quot;,&quot;r=h&quot;
    hDeskDC=GetWindowDC_Call.GetWindowDC(CLng(hwnd))
    Set GetWindowDC_Call=Nothing
    &#039;---------------------------------------------------------------------------------
    color=&amp;Hff8000
    Set CreateSolidBrush_Call    =CreateObject(&quot;DynamicWrapper&quot;)
    CreateSolidBrush_Call.Register &quot;GDI32.DLL&quot;,&quot;CreateSolidBrush&quot;,&quot;i=l&quot;,&quot;f=s&quot;,&quot;r=h&quot;
    hBrush=CreateSolidBrush_Call.CreateSolidBrush(CLng(color))
    Set CreateSolidBrush_Call=Nothing
    &#039;---------------------------------------------------------------------------------
    Set FillRect_Call        =CreateObject(&quot;DynamicWrapper&quot;)
    FillRect_Call.Register &quot;USER32.DLL&quot;,&quot;FillRect&quot;,&quot;i=hlh&quot;,&quot;f=s&quot;,&quot;r=u&quot;
    FillRect_Call.FillRect CLng(hDeskDC),CLng(RECT.baseAddr),CLng(hBrush)
    Set FillRect_Call=Nothing
    &#039;---------------------------------------------------------------------------------
    Set RECT=Nothing
    WScript.Echo(&quot;Область заполнена с использованием структуры RECT :-)&quot;)
End Function

&#039;-----------------------------------------------------------------------------------------
&#039;----------- Отслеживание движений курсора мыши ------------------------------------------
&#039;-----------------------------------------------------------------------------------------
Function trackMouse()
    WScript.Echo(&quot;Движение курсора мыши отслеживается с помощью структуры POINT :-)&quot;)
    &#039;---------------------------------------------------------------------------------
    &#039;Заполнение структуры
        iOfs=0
        Set POINT=new Struct
        POINT.initStruct(8)
    &#039;---------------------------------------------------------------------------------
    Set GetCursorPos_Call        =CreateObject(&quot;DynamicWrapper&quot;)
    GetCursorPos_Call.Register &quot;USER32.DLL&quot;,&quot;GetCursorPos&quot;,&quot;i=l&quot;,&quot;f=s&quot;
    While 1
        GetCursorPos_Call.GetCursorPos CLng(POINT.baseAddr)
        x=POINT.GetDataDWORD(POINT.baseAddr,4,0)
        y=POINT.GetDataDWORD(POINT.baseAddr,4,4)
        ax3.ToolTip     vbCR &amp; _
                &quot;X &quot; &amp;     x &amp; vbCR &amp; _
                &quot;Y &quot; &amp;    y &amp; vbCR &amp; _
                &quot;Наведите указатель чтобы&quot;      &amp; vbCR &amp; _
                &quot;прекратить выполнение&quot;     &amp; vbCR,10,10 
        &#039;-------------------------------------------------------------------------
        If x&lt;60 And y&lt;60 then 
            Set POINT=Nothing
            Exit Function
        End If
    Wend
    &#039;---------------------------------------------------------------------------------
End Function
&#039;-----------------------------------------------------------------------------------------
    paintRect()
    trackMouse()</code></pre></div><p>Автор примера - <strong>Poltergeyst</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Sat, 03 May 2008 07:53:28 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=10722#p10722</guid>
		</item>
	</channel>
</rss>
