1

Тема: AHK: Определение видимой области окна на экране

Здравствуйте!
Такой вопрос, может и не осуществляемый но все же решил спросить, есть скрипт ahk с окном Gui, можно ли какими то средствами AHK определять сколько процентов окна видно сейчас на экране монитора, для тех случаев когда оно неактивно и немного прикрыто другим каким нибудь окном?

К примеру на этот гуи:

    WS_EX_LAYERED := 0x00080000
    Gui, +Owner
    Gui, Add, Picture, x0 y0 w420 h330 Hidden gMyPic vMyPic, %SlidePic%
    Gui, +LastFound -Caption +E0x80000
    GuiHwnd := WinExist()
    
    result:=DllCall("SetLayeredWindowAttributes" ;========<<ПРОБЛЕМНАЯФУНКЦИЯ>>==========
       , UInt, GuiHwnd
       , Uint, 0x0099aaee   ;0x00bbggrr
       , Char, 0xff
       , Uint, 1)   ;LWA_COLORKEY:=1   ;LWA_ALPHA:=2
    
    
    Gui, Color, EEAA99
    Transparency = 0
    WinSet, Transparent, %Transparency% %Transparency%, MySlideShow
    Gui Show, x860 y440 w420 h330, MySlideShow
    GuiControl, Show, MyPic

2 (изменено: teadrinker, 2011-01-30 23:45:31)

Re: AHK: Определение видимой области окна на экране

Определить, какая часть окна видима, можно сосчитав, сколько точек окна перекрыто другими окнами, лежащими выше него, и краем монитора. Хэндлы окон в порядке сверху до низу возвращает команда

WinGet, List, List

Будем проверять каждую точку окна, перекрыта она, или нет. Наверное, не очень рационально по скорости, но алгоритм высчитывания и вычитания перекрытых площадей (а окно могут перекрывать несколько других окон, в свою очередь, перекрывающих друг друга) будет гораздо более сложным.

hWnd =    ; указать реальный хэндл окна

SetBatchLines -1
MsgBox, % GetVisibleSquare(hWnd)
Return

GetVisibleSquare(hWnd)
{
   if !WinExist("ahk_id " hWnd)
      Return "Видимого окна с данным хэндлом не существует!"
      
   SquareCovered := i := 0
   WinGetPos, X, Y, W, H, ahk_id %hWnd%
   X1 := X < 0 ? 0 : X
   Y1 := Y < 0 ? 0 : Y
   X2 := X + W > A_ScreenWidth ? A_ScreenWidth : X + W
   Y2 := Y + H > A_ScreenHeight ? A_ScreenHeight : Y + H
   SquareReal := W * H
   SquareOnScreen := (X2 - X1) * (Y2 - Y1)   ; площадь, не перекрытая краем монитора
   
   WinGet, List, List
   While List%A_Index% != hWnd
   {
      i++
      WinGetPos, X, Y, W, H, % "ahk_id " List%A_Index%
      X1_%i% := X < 0 ? 0 : X
      Y1_%i% := Y < 0 ? 0 : Y
      X2_%i% := X + W > A_ScreenWidth ? A_ScreenWidth : X + W < 0 ? 0 : X + W
      Y2_%i% := Y + H > A_ScreenHeight ? A_ScreenHeight : Y + H < 0 ? 0 : Y + H
      
      if (X1_%i% <= X1 && X2 <= X2_%i% && Y1_%i% <= Y1 && Y2 <= Y2_%i%)
         Return 0    ; окно полностью перекрывает целевое
      
      if (X1_%i% > X2 || X1 > X2_%i% || Y1_%i% > Y2 || Y1 > Y2_%i%)   ; окно не перекрывает целевое
         i--                                                          ; отсеиваем его из дальнейшей проверки
   }
   if i = 0
      Return 100 - Round((SquareReal - SquareOnScreen)*100/SquareReal)
      
   Loop % Y2 - Y1
   {
      Y := Y1 + A_Index - 1
      Loop % X2 - X1
      {
         X := X1 + A_Index - 1
         Loop % i
         {
            if (X >= X1_%A_Index% && X <= X2_%A_Index%   ; проверяем, перекрыта ли данная точка
               && Y >= Y1_%A_Index% && Y <= Y2_%A_Index%)
            {
               SquareCovered++
               Break
            }
         }
      }
   }
   Return 100 - Round((SquareCovered + SquareReal - SquareOnScreen)*100/SquareReal)
}

Правда, такой алгоритм сработает только для стандартных, прямоугольных окон.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Определение видимой области окна на экране

Спасибо teadrinker!
Отлично!