Автор Тема: _WinGetVisibility() - Определение видимости окна  (Прочитано 3487 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Функция позволяет узнать степень видимости (полность видимое, частично видимое или полностью скрытое) указанного окна. Для работы функции требуется WinAPIEx.au3.

Код: AutoIt [Выделить]
#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

« Последнее редактирование: Апрель 29, 2012, 02:55:04 от Yashied »


Думай, прежде чем говорить.

Русское сообщество AutoIt

_WinGetVisibility() - Определение видимости окна
« Отправлен: Апрель 29, 2012, 02:47:26 »

Оффлайн Zaramot [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1160
  • Репутация: 655
  • Пол: Мужской
  • I ♥ AutoIt
    • Награды
  • Версия AutoIt: 3.3.8.1
Re: _WinGetVisibility() - Определение видимости окна
« Ответ #1, Отправлен: Апрель 29, 2012, 03:00:45 »
Как-то не правильно работает она:

За пределами рабочего стола:
Нажмите для отображения изображения в оригинальном размере.

Частично скрыто:
Нажмите для отображения изображения в оригинальном размере.

PS. Windows XP SP3

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: _WinGetVisibility() - Определение видимости окна
« Ответ #2, Отправлен: Апрель 29, 2012, 03:05:57 »
Понятия не имею, у меня работает на Windows 7. Разбирайся со своими "украшалками". Да и вообще, у тебя окно называется "Калькулятор Плюс". Надеюсь это учтено?
« Последнее редактирование: Апрель 29, 2012, 03:17:25 от Yashied »

Оффлайн Zaramot [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1160
  • Репутация: 655
  • Пол: Мужской
  • I ♥ AutoIt
    • Награды
  • Версия AutoIt: 3.3.8.1
Re: _WinGetVisibility() - Определение видимости окна
« Ответ #3, Отправлен: Апрель 29, 2012, 03:27:51 »
Цитировать
у тебя окно называется "Калькулятор Плюс". Надеюсь это учтено?
ДА!

Русское сообщество AutoIt

Re: _WinGetVisibility() - Определение видимости окна
« Ответ #3 Отправлен: Апрель 29, 2012, 03:27:51 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2288
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Данная функция не поддерживает более одного монитора.
Тут нужно применять _WinAPI_GetSystemMetrics с $SM_CYVIRTUALSCREEN и $SM_CXVIRTUALSCREEN, чтобы получить координаты всей рабочей области.


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt

Re: _WinGetVisibility() - Определение видимости окна
« Ответ #4 Отправлен: Июнь 07, 2014, 02:10:25 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
5 Ответов
3501 Просмотров
Последний ответ Март 16, 2011, 13:52:29
от pan1982
4 Ответов
6094 Просмотров
Последний ответ Октябрь 23, 2011, 20:43:12
от r35p3ct
6 Ответов
3218 Просмотров
Последний ответ Апрель 29, 2012, 02:48:47
от Yashied
2 Ответов
1941 Просмотров
Последний ответ Апрель 30, 2013, 16:56:48
от erlik
1 Ответов
2367 Просмотров
Последний ответ Июль 17, 2013, 13:35:41
от InnI
2 Ответов
1042 Просмотров
Последний ответ Август 22, 2014, 15:30:20
от kadi
2 Ответов
472 Просмотров
Последний ответ Август 19, 2017, 12:02:16
от lixar21
2 Ответов
2666 Просмотров
Последний ответ Ноябрь 22, 2017, 11:28:01
от Mute
4 Ответов
650 Просмотров
Последний ответ Ноябрь 02, 2017, 03:29:22
от dr.room
0 Ответов
315 Просмотров
Последний ответ Июнь 20, 2018, 15:41:48
от dr.room