Что нового

Исчезновение окна GUI при загораживании целевого окна

SergVrn

Новичок
Сообщения
87
Репутация
2
Доброго времени суток.
Помогите со скриптом.

Есть скрипт, который располагает на браузер Chrome - прозрачное окно, где по границам идут пнг-рисунки.
Если окно сжать или развернуть на весь экран или переместить - то прозрачное окно GUI тоже изменится или переместится.
Все работает хорошо.

Но есть вопрос.
Если несвернутое окно Chrome - закрывает другое окно, то прозрачный GUI - остается поверх всех окон.
Как изменить скрипт, чтобы если окно Chrome - не скрыто, но перекрыто (полностью загорожено) другим окном - прозрачное окно GUI - тоже исчезало ?

(сейчас прозрачное окно GUI - исчезает только если свернуть 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
 

Вложения

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

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Замените строку создания GUI на эту
Код:
$hGUI = GUICreate("", 100, 100, 0, 0, $WS_POPUP, BitOR($WS_EX_TRANSPARENT, $WS_EX_LAYERED), $hWnd)
 
Верх