Что нового

Расположение пнг по сторонам окна, с отступом и с прозрачным окном

SergVrn

Новичок
Сообщения
87
Репутация
2
Добрый день.
Помогите разобраться с объединением трех скриптов в один.

У меня есть скрипт, который размещает картинки по углам и сторонам окна.
Код:
;~ AutoIt Version: 3.3.14.5
#include <GUIConstants.au3>
#include <GDIPlus.au3>
Global Enum $CORNER_LEFTTOP, $CORNER_LEFTBOTTOM, $CORNER_RIGHTTOP, $CORNER_RIGHTBOTTOM, $CORNER_MAX

_Example()

Func _Example()
    Local $hGUI = GUICreate("Пример", 800, 900)
    Local $idFrame = _GUICtrlPic_CreateFrame($hGUI, "Слева.png", "Верх.png", "Справа.png", "Низ.png")

    Local $aPics[$CORNER_MAX] = ["Угол -левый верхний.png", _
            "Угол -левый нижний.png", _
            "Угол -правый верхний.png", _
            "Угол -правый нижний.png"]
    For $iCorner = 0 To $CORNER_MAX - 1
        $aPics[$iCorner] = _GUICtrlPic_CreateInCorner($hGUI, $aPics[$iCorner], $iCorner)
    Next
    GUISetState()

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc   ;==>_Example

Func _GUICtrlPic_Create($sFile, $iX, $iY, $iW = -1, $iH = -1, $iStyle = -1, $iExStyle = -1)
    _GDIPlus_Startup()
    Local $hBMP = IsPtr($sFile) ? $sFile : _GDIPlus_BitmapCreateFromFile($sFile)
    If @error Then Return SetError(1, _GDIPlus_Shutdown(), 0)

    If $iW = -1 Then $iW = _GDIPlus_ImageGetWidth($hBMP)
    If $iH = -1 Then $iH = _GDIPlus_ImageGetHeight($hBMP)
    Local $idPic = GUICtrlCreatePic("", $iX, $iY, $iW, $iH, $iStyle, $iExStyle)
    Local $hHBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBMP)
    Local $hPrevHBMP = GUICtrlSendMsg($idPic, $STM_SETIMAGE, 0, $hHBMP)
    GUICtrlSetState(-1, $GUI_DISABLE)
    _WinAPI_DeleteObject($hHBMP)
    If $hPrevHBMP Then _WinAPI_DeleteObject($hPrevHBMP)

    _GDIPlus_BitmapDispose($hBMP)
    _GDIPlus_Shutdown()
    Return $idPic
EndFunc   ;==>_GUICtrlPic_Create

Func _GUICtrlPic_CreateFrame($hGUI, $sFileLeft, $sFileTop, $sFileRight, $sFileBottom)
    Local $aWH = WinGetClientSize($hGUI)
    If @error Then Return SetError(1, 0, 0)

    _GDIPlus_Startup()
    Local $hFrameBMP = _GDIPlus_BitmapCreateFromScan0($aWH[0], $aWH[1])
    Local $hFrameGraph = _GDIPlus_ImageGetGraphicsContext($hFrameBMP)
    _GDIPlus_GraphicsSetSmoothingMode($hFrameGraph, $GDIP_SMOOTHINGMODE_NONE)
    _GDIPlus_GraphicsSetPixelOffsetMode($hFrameGraph, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)

    Local Enum $SIDE_LEFT, $SIDE_TOP, $SIDE_RIGHT, $SIDE_BOTTOM, $SIDE_MAX
    Local $aFrame[$SIDE_MAX] = [$sFileLeft, $sFileTop, $sFileRight, $sFileBottom]
    Local $hTexBMP, $hTex, $iTexW, $iTexH, $hTempBMP, $hTempGraph, $aXYWH[4]
    For $iSide = 0 To $SIDE_MAX - 1
        $hTexBMP = _GDIPlus_BitmapCreateFromFile($aFrame[$iSide])
        If @error Then ContinueLoop
        $iTexW = _GDIPlus_ImageGetWidth($hTexBMP)
        $iTexH = _GDIPlus_ImageGetHeight($hTexBMP)
        $hTex = _GDIPlus_TextureCreate($hTexBMP)
        Switch $iSide
            Case $SIDE_LEFT, $SIDE_RIGHT
                $aXYWH[0] = ($iSide = $SIDE_RIGHT) ? $aWH[0] - $iTexW : 0
                $aXYWH[1] = 0
                $aXYWH[2] = $iTexW
                $aXYWH[3] = $aWH[1]
            Case $SIDE_TOP, $SIDE_BOTTOM
                $aXYWH[0] = 0
                $aXYWH[1] = ($iSide = $SIDE_BOTTOM) ? $aWH[1] - $iTexH : 0
                $aXYWH[2] = $aWH[0]
                $aXYWH[3] = $iTexH
        EndSwitch
        $hTempBMP = _GDIPlus_BitmapCreateFromScan0($aXYWH[2], $aXYWH[3])
        $hTempGraph = _GDIPlus_ImageGetGraphicsContext($hTempBMP)
        _GDIPlus_GraphicsSetSmoothingMode($hTempGraph, $GDIP_SMOOTHINGMODE_NONE)
        _GDIPlus_GraphicsSetPixelOffsetMode($hTempGraph, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)

        _GDIPlus_GraphicsFillRect($hTempGraph, 0, 0, $aXYWH[2], $aXYWH[3], $hTex)
        _GDIPlus_GraphicsDrawImageRect($hFrameGraph, $hTempBMP, $aXYWH[0], $aXYWH[1], $aXYWH[2], $aXYWH[3])

        _GDIPlus_BrushDispose($hTex)
        _GDIPlus_GraphicsDispose($hTempGraph)
        _GDIPlus_BitmapDispose($hTempBMP)
        _GDIPlus_BitmapDispose($hTexBMP)
    Next
    Local $idPic = _GUICtrlPic_Create($hFrameBMP, 0, 0, $aWH[0], $aWH[1])
    _GDIPlus_GraphicsDispose($hFrameGraph)
    _GDIPlus_Shutdown()
    Return $idPic
EndFunc   ;==>_GUICtrlPic_CreateFrame

Func _GUICtrlPic_CreateInCorner($hGUI, $sFile, $iCorner)
    Local $aWH = WinGetClientSize($hGUI)
    If @error Then Return SetError(1, 0, 0)
    _GDIPlus_Startup()
    Local $hBMP = _GDIPlus_BitmapCreateFromFile($sFile)
    If @error Then Return SetError(2, _GDIPlus_Shutdown(), 0)

    Local $aXYWH[4] = [0, 0, _GDIPlus_ImageGetWidth($hBMP), _GDIPlus_ImageGetHeight($hBMP)]
    Switch $iCorner
        Case $CORNER_LEFTBOTTOM
            $aXYWH[1] = $aWH[1] - $aXYWH[3]
        Case $CORNER_RIGHTTOP
            $aXYWH[0] = $aWH[0] - $aXYWH[2]
        Case $CORNER_RIGHTBOTTOM
            $aXYWH[0] = $aWH[0] - $aXYWH[2]
            $aXYWH[1] = $aWH[1] - $aXYWH[3]
    EndSwitch
    Local $idPic = _GUICtrlPic_Create($hBMP, $aXYWH[0], $aXYWH[1], $aXYWH[2], $aXYWH[3])
    _GDIPlus_Shutdown()
    Return $idPic
EndFunc   ;==>_GUICtrlPic_CreateInCorner

Нашел на сайте еще два скрипта:
Первый скрипт - делает окно прозрачным, пропускает насквозь - клики мышкой и подгоняет размеры созданного окна - под размеры окна браузера Chrome.
Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>

While Sleep(11)
  $hWnd = WinGetHandle("[RegexpTitle: - Google Chrome]")
  If $hWnd Then Monitor($hWnd)
WEnd

Func Monitor($hWnd)
  WinActivate($hWnd)
  Local $aPos = WinGetPos($hWnd)
  Local $Frame = GUICreate("", 100, 100, 0, 0, $WS_CAPTION, BitOR($WS_EX_TRANSPARENT, $WS_EX_LAYERED), $hWnd)
  GUISetState()
  WinMove($Frame, "", $aPos[0], $aPos[1], $aPos[2], $aPos[3])
  GUISetBkColor(0xAABBCC)
  _WinAPI_SetLayeredWindowAttributes($Frame, 0xAABBCC, 0, $LWA_COLORKEY)
  While Sleep(11)
    If Not IsHWnd($hWnd) Then ExitLoop
    Local $aNewPos = WinGetPos($hWnd)
    If $aNewPos[0] <> $aPos[0] _
    Or $aNewPos[1] <> $aPos[1] _
    Or $aNewPos[2] <> $aPos[2] _
    Or $aNewPos[3] <> $aPos[3] Then
      $aPos = $aNewPos
      WinMove($Frame, "", $aPos[0], $aPos[1], $aPos[2], $aPos[3])
    EndIf
  WEnd
  GUIDelete($Frame)
EndFunc

Второй скрипт - размещает пнг-картинки - не по краям окна, а с определенным отступом за края окна.
Код:
#include <GDIPlus.au3>
#include <WinAPIEx.au3>
#include <GUIConstants.au3>

Global $hGUI1 = GUICreate('Title', 250, 150, -1, -1)
Local $pos = WinGetPos($hGUI1)
Global $hGUI = GUICreate("PET", 1, 1, -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOOLWINDOW, $WS_EX_MDICHILD), $hGUI1)
GUISetBkColor(50)
$Pic = GUICtrlCreatePic("", 0, 0, $pos[2] + 40, $pos[3] + 40, -1, $GUI_WS_EX_PARENTDRAG)
_SetPNGIntoPicControl($Pic, @ScriptDir & "\1.png")
WinMove($hGUI, '', $pos[0] - 20, $pos[1] - 20, $pos[2] + 40, $pos[3] + 40)
_WinAPI_SetLayeredWindowAttributes($hGUI, 50, 255)
GUISetState(@SW_SHOW, $hGUI1)
GUISetState(@SW_SHOW, $hGUI)
GUIRegisterMsg($WM_MOVING, "WM_MOVING")
While 1
    Switch GUIGetMsg()
        Case -3
            Exit
    EndSwitch
WEnd

Func WM_MOVING($hWnd, $Msg, $wParam, $lParam)
    ; получает координаты сторон окна
    Local $sRect = DllStructCreate("Int[4]", $lParam)
    Local $left = DllStructGetData($sRect, 1, 1)
    Local $top = DllStructGetData($sRect, 1, 2)
;~  Local $Right = DllStructGetData($sRect, 1, 3)
;~  Local $bottom = DllStructGetData($sRect, 1, 4)
    If $hWnd = $hGUI Then
        Local $pos = WinGetPos($hGUI)
        WinMove($hGUI1, '', $pos[0] + 20, $pos[1] + 20)
    EndIf

    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOVING

Func _SetPNGIntoPicControl($iPic, $sPNGFile)
    _GDIPlus_Startup()
    Local $hImage = _GDIPlus_ImageLoadFromFile($sPNGFile)
    Local $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    _WinAPI_DeleteObject(GUICtrlSendMsg($iPic, 0x172, 0, $hBitmap))
    _WinAPI_DeleteObject($hBitmap)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
EndFunc   ;==>_SetPNGIntoPicControl

Подскажите - как объединить эти три скрипта в один - чтобы пнг - так же размещалось по углам и сторонам окна, но не по краю окна - а с отступом от него и чтобы оно было прозрачным, пропускающим клики ?
 

Вложения

  • 1.rar
    90.8 КБ · Просмотры: 1

InnI

AutoIT Гуру
Сообщения
4,923
Репутация
1,432
Что вы сделать-то хотите? Красиво оформить рабочий стол? ;)

Внесите изменения в первый скрипт (три строки добавить, одну изменить)
Код:
#include <WinAPI.au3> ; <= добавить

...

Func _Example()
    Local $hGUI = GUICreate("Пример", @DesktopWidth, @DesktopHeight - 40, 0, 0, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TRANSPARENT, $WS_EX_LAYERED)) ; <= изменить
    Local $idFrame = _GUICtrlPic_CreateFrame($hGUI, "Слева.png", "Верх.png", "Справа.png", "Низ.png")

    Local $aPics[$CORNER_MAX] = ["Угол -левый верхний.png", _
            "Угол -левый нижний.png", _
            "Угол -правый верхний.png", _
            "Угол -правый нижний.png"]
    For $iCorner = 0 To $CORNER_MAX - 1
        $aPics[$iCorner] = _GUICtrlPic_CreateInCorner($hGUI, $aPics[$iCorner], $iCorner)
    Next
    GUISetState()
    GUISetBkColor(0xAABBCC) ; <= добавить
    _WinAPI_SetLayeredWindowAttributes($hGUI, 0xAABBCC, 0, $LWA_COLORKEY) ; <= добавить

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc   ;==>_Example
 
Автор
S

SergVrn

Новичок
Сообщения
87
Репутация
2
InnI [?]
Что вы сделать-то хотите? Красиво оформить рабочий стол?

Да просто окно оформить красиво.



Добавлено:
Сообщение автоматически объединено:

InnI
Спасибо.

Я сделал как вы посоветовали и у меня получился вот такой скрипт:
Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>

While Sleep(11)
  $hWnd = WinGetHandle("[RegexpTitle: - Google Chrome]")
  If $hWnd Then Monitor($hWnd)
 If $hWnd Then _Example($hWnd)
WEnd

Func Monitor($hWnd)
  WinActivate($hWnd)
  Local $aPos = WinGetPos($hWnd)
  Local $Frame = GUICreate("", 100, 100, 0, 0, $WS_CAPTION, BitOR($WS_EX_TRANSPARENT, $WS_EX_LAYERED), $hWnd)
  GUISetState()
  WinMove($Frame, "", $aPos[0], $aPos[1], $aPos[2], $aPos[3])
  GUISetBkColor(0xAABBCC)
  _WinAPI_SetLayeredWindowAttributes($Frame, 0xAABBCC, 0, $LWA_COLORKEY)
  While Sleep(11)
    If Not IsHWnd($hWnd) Then ExitLoop
    Local $aNewPos = WinGetPos($hWnd)
    If $aNewPos[0] <> $aPos[0] _
    Or $aNewPos[1] <> $aPos[1] _
    Or $aNewPos[2] <> $aPos[2] _
    Or $aNewPos[3] <> $aPos[3] Then
      $aPos = $aNewPos
      WinMove($Frame, "", $aPos[0], $aPos[1], $aPos[2], $aPos[3])
    EndIf
  WEnd
  GUIDelete($Frame)
EndFunc


Func _Example()
    Local $hGUI = GUICreate("Пример", @DesktopWidth, @DesktopHeight - 40, 0, 0, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TRANSPARENT, $WS_EX_LAYERED)) ; <= изменить
    Local $idFrame = _GUICtrlPic_CreateFrame($hGUI, "Слева.png", "Верх.png", "Справа.png", "Низ.png")

    Local $aPics[$CORNER_MAX] = ["Угол -левый верхний.png", _
            "Угол -левый нижний.png", _
            "Угол -правый верхний.png", _
            "Угол -правый нижний.png"]
    For $iCorner = 0 To $CORNER_MAX - 1
        $aPics[$iCorner] = _GUICtrlPic_CreateInCorner($hGUI, $aPics[$iCorner], $iCorner)
    Next
    GUISetState()
    GUISetBkColor(0xAABBCC) ; <= добавить
    _WinAPI_SetLayeredWindowAttributes($hGUI, 0xAABBCC, 0, $LWA_COLORKEY) ; <= добавить

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc   ;==>_Example

Но он только создает прозрачное окно, пропускающее клики.
А пнг-рисунки с отступом от края - не отображает.

Ведь функция _Example - она в первом скрипте - нигде не запускается вроде бы.
Может она из-за этого и не срабатывает ?
 

InnI

AutoIT Гуру
Сообщения
4,923
Репутация
1,432
SergVrn [?]
у меня получился вот такой скрипт
У меня этот скрипт не запускается. Да и не должен...

функция _Example - она в первом скрипте - нигде не запускается вроде бы
В шестой строке она вызывается.

просто окно оформить красиво
Чужое окно? Т.е. положить своё окно поверх чужого, пропускать клики и мониторить перемещение?
 
Автор
S

SergVrn

Новичок
Сообщения
87
Репутация
2
InnI
Ясно, я не тот скрипт редактировал.

Вот сейчас скрипт выглядит так:
Код:
;~ AutoIt Version: 3.3.14.5
#include <WinAPI.au3> ; <= добавить
#include <GUIConstants.au3>
#include <GDIPlus.au3>
Global Enum $CORNER_LEFTTOP, $CORNER_LEFTBOTTOM, $CORNER_RIGHTTOP, $CORNER_RIGHTBOTTOM, $CORNER_MAX

_Example()

Func _Example()
    Local $hGUI = GUICreate("Пример", @DesktopWidth, @DesktopHeight - 40, 0, 0, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TRANSPARENT, $WS_EX_LAYERED)) ; <= изменить
    Local $idFrame = _GUICtrlPic_CreateFrame($hGUI, "Слева.png", "Верх.png", "Справа.png", "Низ.png")

    Local $aPics[$CORNER_MAX] = ["Угол -левый верхний.png", _
            "Угол -левый нижний.png", _
            "Угол -правый верхний.png", _
            "Угол -правый нижний.png"]
    For $iCorner = 0 To $CORNER_MAX - 1
        $aPics[$iCorner] = _GUICtrlPic_CreateInCorner($hGUI, $aPics[$iCorner], $iCorner)
    Next
    GUISetState()
	GUISetBkColor(0xAABBCC) ; <= добавить
	_WinAPI_SetLayeredWindowAttributes($hGUI, 0xAABBCC, 0, $LWA_COLORKEY) ; <= добавить

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc   ;==>_Example

Func _GUICtrlPic_Create($sFile, $iX, $iY, $iW = -1, $iH = -1, $iStyle = -1, $iExStyle = -1)
    _GDIPlus_Startup()
    Local $hBMP = IsPtr($sFile) ? $sFile : _GDIPlus_BitmapCreateFromFile($sFile)
    If @error Then Return SetError(1, _GDIPlus_Shutdown(), 0)

    If $iW = -1 Then $iW = _GDIPlus_ImageGetWidth($hBMP)
    If $iH = -1 Then $iH = _GDIPlus_ImageGetHeight($hBMP)
    Local $idPic = GUICtrlCreatePic("", $iX, $iY, $iW, $iH, $iStyle, $iExStyle)
    Local $hHBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBMP)
    Local $hPrevHBMP = GUICtrlSendMsg($idPic, $STM_SETIMAGE, 0, $hHBMP)
    GUICtrlSetState(-1, $GUI_DISABLE)
    _WinAPI_DeleteObject($hHBMP)
    If $hPrevHBMP Then _WinAPI_DeleteObject($hPrevHBMP)

    _GDIPlus_BitmapDispose($hBMP)
    _GDIPlus_Shutdown()
    Return $idPic
EndFunc   ;==>_GUICtrlPic_Create

Func _GUICtrlPic_CreateFrame($hGUI, $sFileLeft, $sFileTop, $sFileRight, $sFileBottom)
    Local $aWH = WinGetClientSize($hGUI)
    If @error Then Return SetError(1, 0, 0)

    _GDIPlus_Startup()
    Local $hFrameBMP = _GDIPlus_BitmapCreateFromScan0($aWH[0], $aWH[1])
    Local $hFrameGraph = _GDIPlus_ImageGetGraphicsContext($hFrameBMP)
    _GDIPlus_GraphicsSetSmoothingMode($hFrameGraph, $GDIP_SMOOTHINGMODE_NONE)
    _GDIPlus_GraphicsSetPixelOffsetMode($hFrameGraph, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)

    Local Enum $SIDE_LEFT, $SIDE_TOP, $SIDE_RIGHT, $SIDE_BOTTOM, $SIDE_MAX
    Local $aFrame[$SIDE_MAX] = [$sFileLeft, $sFileTop, $sFileRight, $sFileBottom]
    Local $hTexBMP, $hTex, $iTexW, $iTexH, $hTempBMP, $hTempGraph, $aXYWH[4]
    For $iSide = 0 To $SIDE_MAX - 1
        $hTexBMP = _GDIPlus_BitmapCreateFromFile($aFrame[$iSide])
        If @error Then ContinueLoop
        $iTexW = _GDIPlus_ImageGetWidth($hTexBMP)
        $iTexH = _GDIPlus_ImageGetHeight($hTexBMP)
        $hTex = _GDIPlus_TextureCreate($hTexBMP)
        Switch $iSide
            Case $SIDE_LEFT, $SIDE_RIGHT
                $aXYWH[0] = ($iSide = $SIDE_RIGHT) ? $aWH[0] - $iTexW : 0
                $aXYWH[1] = 0
                $aXYWH[2] = $iTexW
                $aXYWH[3] = $aWH[1]
            Case $SIDE_TOP, $SIDE_BOTTOM
                $aXYWH[0] = 0
                $aXYWH[1] = ($iSide = $SIDE_BOTTOM) ? $aWH[1] - $iTexH : 0
                $aXYWH[2] = $aWH[0]
                $aXYWH[3] = $iTexH
        EndSwitch
        $hTempBMP = _GDIPlus_BitmapCreateFromScan0($aXYWH[2], $aXYWH[3])
        $hTempGraph = _GDIPlus_ImageGetGraphicsContext($hTempBMP)
        _GDIPlus_GraphicsSetSmoothingMode($hTempGraph, $GDIP_SMOOTHINGMODE_NONE)
        _GDIPlus_GraphicsSetPixelOffsetMode($hTempGraph, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)

        _GDIPlus_GraphicsFillRect($hTempGraph, 0, 0, $aXYWH[2], $aXYWH[3], $hTex)
        _GDIPlus_GraphicsDrawImageRect($hFrameGraph, $hTempBMP, $aXYWH[0], $aXYWH[1], $aXYWH[2], $aXYWH[3])

        _GDIPlus_BrushDispose($hTex)
        _GDIPlus_GraphicsDispose($hTempGraph)
        _GDIPlus_BitmapDispose($hTempBMP)
        _GDIPlus_BitmapDispose($hTexBMP)
    Next
    Local $idPic = _GUICtrlPic_Create($hFrameBMP, 0, 0, $aWH[0], $aWH[1])
    _GDIPlus_GraphicsDispose($hFrameGraph)
    _GDIPlus_Shutdown()
    Return $idPic
EndFunc   ;==>_GUICtrlPic_CreateFrame

Func _GUICtrlPic_CreateInCorner($hGUI, $sFile, $iCorner)
    Local $aWH = WinGetClientSize($hGUI)
    If @error Then Return SetError(1, 0, 0)
    _GDIPlus_Startup()
    Local $hBMP = _GDIPlus_BitmapCreateFromFile($sFile)
    If @error Then Return SetError(2, _GDIPlus_Shutdown(), 0)

    Local $aXYWH[4] = [0, 0, _GDIPlus_ImageGetWidth($hBMP), _GDIPlus_ImageGetHeight($hBMP)]
    Switch $iCorner
        Case $CORNER_LEFTBOTTOM
            $aXYWH[1] = $aWH[1] - $aXYWH[3]
        Case $CORNER_RIGHTTOP
            $aXYWH[0] = $aWH[0] - $aXYWH[2]
        Case $CORNER_RIGHTBOTTOM
            $aXYWH[0] = $aWH[0] - $aXYWH[2]
            $aXYWH[1] = $aWH[1] - $aXYWH[3]
    EndSwitch
    Local $idPic = _GUICtrlPic_Create($hBMP, $aXYWH[0], $aXYWH[1], $aXYWH[2], $aXYWH[3])
    _GDIPlus_Shutdown()
    Return $idPic
EndFunc   ;==>_GUICtrlPic_CreateInCorner

Но он - не выполняет функцию второго скрипта - который отслеживает окно Func Monitor($hWnd)
Которая в свою очередь - ориентируется на размер окна браузера Chrome - ("[RegexpTitle: - Google Chrome]")


Добавлено:
Сообщение автоматически объединено:

InnI
своё окно поверх чужого, пропускать клики и мониторить перемещение?
Да. Эту функцию выполняет второй скрипт, но вопрос - как его подсоединить к основному скрипту ?
 

InnI

AutoIT Гуру
Сообщения
4,923
Репутация
1,432
Вот полный код. Но при изменении размеров или положения окна Chrome - мерцать будет сильно
Код:
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>

Global Enum $CORNER_LEFTTOP, $CORNER_LEFTBOTTOM, $CORNER_RIGHTTOP, $CORNER_RIGHTBOTTOM, $CORNER_MAX
Global $hGUI = -1, $aPos[4]

While Sleep(11)
  $hWnd = WinGetHandle("[RegexpTitle: - Google Chrome]")
  If $hWnd Then Monitor($hWnd)
  Global $aPos[4]
WEnd

Func Monitor($hWnd)
  WinActivate($hWnd)
  $aNewPos = WinGetPos($hWnd)
  While Sleep(11)
    If Not IsHWnd($hWnd) Then Return GUIDelete($hGUI)
    Local $aNewPos = WinGetPos($hWnd)
    If $aNewPos[0] <> $aPos[0] _
    Or $aNewPos[1] <> $aPos[1] _
    Or $aNewPos[2] <> $aPos[2] _
    Or $aNewPos[3] <> $aPos[3] Then
      $aPos = $aNewPos
      GUIDelete($hGUI)
      $hGUI = GUICreate("", 100, 100, 0, 0, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TRANSPARENT, $WS_EX_LAYERED, $WS_EX_TOOLWINDOW))
      WinMove($hGUI, "", $aPos[0], $aPos[1], $aPos[2], $aPos[3])
      Local $idFrame = _GUICtrlPic_CreateFrame($hGUI, "Слева.png", "Верх.png", "Справа.png", "Низ.png")
      Local $aPics[$CORNER_MAX] = ["Угол -левый верхний.png","Угол -левый нижний.png","Угол -правый верхний.png","Угол -правый нижний.png"]
      For $iCorner = 0 To $CORNER_MAX - 1
        $aPics[$iCorner] = _GUICtrlPic_CreateInCorner($hGUI, $aPics[$iCorner], $iCorner)
      Next
      GUISetState(@SW_SHOWNA)
      GUISetBkColor(0xAABBCC)
      _WinAPI_SetLayeredWindowAttributes($hGUI, 0xAABBCC, 0, $LWA_COLORKEY)
    EndIf
  WEnd
EndFunc

Func _GUICtrlPic_Create($sFile, $iX, $iY, $iW = -1, $iH = -1, $iStyle = -1, $iExStyle = -1)
    _GDIPlus_Startup()
    Local $hBMP = IsPtr($sFile) ? $sFile : _GDIPlus_BitmapCreateFromFile($sFile)
    If @error Then Return SetError(1, _GDIPlus_Shutdown(), 0)

    If $iW = -1 Then $iW = _GDIPlus_ImageGetWidth($hBMP)
    If $iH = -1 Then $iH = _GDIPlus_ImageGetHeight($hBMP)
    Local $idPic = GUICtrlCreatePic("", $iX, $iY, $iW, $iH, $iStyle, $iExStyle)
    Local $hHBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hBMP)
    Local $hPrevHBMP = GUICtrlSendMsg($idPic, $STM_SETIMAGE, 0, $hHBMP)
    GUICtrlSetState(-1, $GUI_DISABLE)
    _WinAPI_DeleteObject($hHBMP)
    If $hPrevHBMP Then _WinAPI_DeleteObject($hPrevHBMP)

    _GDIPlus_BitmapDispose($hBMP)
    _GDIPlus_Shutdown()
    Return $idPic
EndFunc   ;==>_GUICtrlPic_Create

Func _GUICtrlPic_CreateFrame($hGUI, $sFileLeft, $sFileTop, $sFileRight, $sFileBottom)
    Local $aWH = WinGetClientSize($hGUI)
    If @error Then Return SetError(1, 0, 0)

    _GDIPlus_Startup()
    Local $hFrameBMP = _GDIPlus_BitmapCreateFromScan0($aWH[0], $aWH[1])
    Local $hFrameGraph = _GDIPlus_ImageGetGraphicsContext($hFrameBMP)
    _GDIPlus_GraphicsSetSmoothingMode($hFrameGraph, $GDIP_SMOOTHINGMODE_NONE)
    _GDIPlus_GraphicsSetPixelOffsetMode($hFrameGraph, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)

    Local Enum $SIDE_LEFT, $SIDE_TOP, $SIDE_RIGHT, $SIDE_BOTTOM, $SIDE_MAX
    Local $aFrame[$SIDE_MAX] = [$sFileLeft, $sFileTop, $sFileRight, $sFileBottom]
    Local $hTexBMP, $hTex, $iTexW, $iTexH, $hTempBMP, $hTempGraph, $aXYWH[4]
    For $iSide = 0 To $SIDE_MAX - 1
        $hTexBMP = _GDIPlus_BitmapCreateFromFile($aFrame[$iSide])
        If @error Then ContinueLoop
        $iTexW = _GDIPlus_ImageGetWidth($hTexBMP)
        $iTexH = _GDIPlus_ImageGetHeight($hTexBMP)
        $hTex = _GDIPlus_TextureCreate($hTexBMP)
        Switch $iSide
            Case $SIDE_LEFT, $SIDE_RIGHT
                $aXYWH[0] = ($iSide = $SIDE_RIGHT) ? $aWH[0] - $iTexW : 0
                $aXYWH[1] = 0
                $aXYWH[2] = $iTexW
                $aXYWH[3] = $aWH[1]
            Case $SIDE_TOP, $SIDE_BOTTOM
                $aXYWH[0] = 0
                $aXYWH[1] = ($iSide = $SIDE_BOTTOM) ? $aWH[1] - $iTexH : 0
                $aXYWH[2] = $aWH[0]
                $aXYWH[3] = $iTexH
        EndSwitch
        $hTempBMP = _GDIPlus_BitmapCreateFromScan0($aXYWH[2], $aXYWH[3])
        $hTempGraph = _GDIPlus_ImageGetGraphicsContext($hTempBMP)
        _GDIPlus_GraphicsSetSmoothingMode($hTempGraph, $GDIP_SMOOTHINGMODE_NONE)
        _GDIPlus_GraphicsSetPixelOffsetMode($hTempGraph, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)

        _GDIPlus_GraphicsFillRect($hTempGraph, 0, 0, $aXYWH[2], $aXYWH[3], $hTex)
        _GDIPlus_GraphicsDrawImageRect($hFrameGraph, $hTempBMP, $aXYWH[0], $aXYWH[1], $aXYWH[2], $aXYWH[3])

        _GDIPlus_BrushDispose($hTex)
        _GDIPlus_GraphicsDispose($hTempGraph)
        _GDIPlus_BitmapDispose($hTempBMP)
        _GDIPlus_BitmapDispose($hTexBMP)
    Next
    Local $idPic = _GUICtrlPic_Create($hFrameBMP, 0, 0, $aWH[0], $aWH[1])
    _GDIPlus_GraphicsDispose($hFrameGraph)
    _GDIPlus_Shutdown()
    Return $idPic
EndFunc   ;==>_GUICtrlPic_CreateFrame

Func _GUICtrlPic_CreateInCorner($hGUI, $sFile, $iCorner)
    Local $aWH = WinGetClientSize($hGUI)
    If @error Then Return SetError(1, 0, 0)
    _GDIPlus_Startup()
    Local $hBMP = _GDIPlus_BitmapCreateFromFile($sFile)
    If @error Then Return SetError(2, _GDIPlus_Shutdown(), 0)

    Local $aXYWH[4] = [0, 0, _GDIPlus_ImageGetWidth($hBMP), _GDIPlus_ImageGetHeight($hBMP)]
    Switch $iCorner
        Case $CORNER_LEFTBOTTOM
            $aXYWH[1] = $aWH[1] - $aXYWH[3]
        Case $CORNER_RIGHTTOP
            $aXYWH[0] = $aWH[0] - $aXYWH[2]
        Case $CORNER_RIGHTBOTTOM
            $aXYWH[0] = $aWH[0] - $aXYWH[2]
            $aXYWH[1] = $aWH[1] - $aXYWH[3]
    EndSwitch
    Local $idPic = _GUICtrlPic_Create($hBMP, $aXYWH[0], $aXYWH[1], $aXYWH[2], $aXYWH[3])
    _GDIPlus_Shutdown()
    Return $idPic
EndFunc   ;==>_GUICtrlPic_CreateInCorner
 
Верх