- Сообщения
- 5,379
- Репутация
- 2,724
Функция позволяет узнать степень видимости (полность видимое, частично видимое или полностью скрытое) указанного окна. Для работы функции требуется WinAPIEx.au3.
Код:
#Include <APIConstants.au3>
#Include <WinAPIEx.au3>
Opt('MustDeclareVars', 1)
Switch _WinGetVisibility('Calculator')
Case 0
Switch @error
Case 1
ConsoleWrite('Ошибка - окно не найдено!' & @CR)
Case Else
ConsoleWrite('Ошибка!' & @CR)
EndSwitch
Case 1
ConsoleWrite('Окно полностью видимое.' & @CR)
Case 2
ConsoleWrite('Окно частично скрыто (другими окнами или находится за пределами рабочей области).' & @CR)
Case 3
ConsoleWrite('Окно скрыто.' & @CR)
Case Else
EndSwitch
Func _WinGetVisibility($sTitle, $sText = '')
Local $hRgn[3] = [0, 0, 0], $hWnd, $tRect, $List, $Result = 0
$hWnd = WinGetHandle($sTitle, $sText)
If @error Then
Return SetError(1, 0, 0)
EndIf
If Not _WinAPI_IsWindowVisible($hWnd) Then
Return 3
EndIf
Do
$hRgn[0] = _WinAPI_CreateNullRgn()
If Not _WinAPI_GetWindowRgn($hWnd, $hRgn[0]) Then
$tRect = _WinAPI_GetWindowRect($hWnd)
If @error Then
ExitLoop
EndIf
$hRgn[0] = _WinAPI_CreateRectRgnIndirect($tRect)
If @error Then
ExitLoop
EndIf
EndIf
$tRect = _WinAPI_GetWorkArea()
If @error Then
ExitLoop
EndIf
$hRgn[1] = _WinAPI_CreateRectRgnIndirect($tRect)
If @error Then
ExitLoop
EndIf
Switch _WinAPI_CombineRgn($hRgn[1], $hRgn[0], $hRgn[1], $RGN_AND)
Case 0
ExitLoop
Case $NULLREGION
$Result = 3
ExitLoop
Case Else
EndSwitch
$List = WinList()
For $i = 1 To $List[0][0]
If $List[$i][1] = $hWnd Then
ExitLoop
EndIf
If _WinAPI_IsWindowVisible($List[$i][1]) Then
If Not $hRgn[2] Then
$hRgn[2] = _WinAPI_CreateNullRgn()
EndIf
If Not _WinAPI_GetWindowRgn($List[$i][1], $hRgn[2]) Then
$tRect = _WinAPI_GetWindowRect($List[$i][1])
If @error Then
ExitLoop 2
EndIf
$hRgn[2] = _WinAPI_CreateRectRgnIndirect($tRect)
If @error Then
ExitLoop 2
EndIf
EndIf
Switch _WinAPI_CombineRgn($hRgn[1], $hRgn[1], $hRgn[2], $RGN_DIFF)
Case 0
ExitLoop 2
Case $NULLREGION
$Result = 3
ExitLoop 2
Case Else
EndSwitch
EndIf
Next
If _WinAPI_EqualRgn($hRgn[0], $hRgn[1]) Then
$Result = 1
Else
$Result = 2
EndIf
Until 1
For $i = 0 To 2
If $hRgn[$i] Then
_WinAPI_DeleteObject($hRgn[$i])
EndIf
Next
Return SetError(2 * Number(Not $Result), 0, $Result)
EndFunc ;==>_WinGetVisibility