Что нового

_WinGetVisibility() - Определение видимости окна

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
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
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Как-то не правильно работает она:

За пределами рабочего стола:


Частично скрыто:


PS. Windows XP SP3
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Понятия не имею, у меня работает на Windows 7. Разбирайся со своими "украшалками". Да и вообще, у тебя окно называется "Калькулятор Плюс". Надеюсь это учтено?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Данная функция не поддерживает более одного монитора.
Тут нужно применять _WinAPI_GetSystemMetrics с $SM_CYVIRTUALSCREEN и $SM_CXVIRTUALSCREEN, чтобы получить координаты всей рабочей области.
 
Верх