Что нового

Элементы GUI Проверить, что окно видно или не видно.

aptyp

Новичок
Сообщения
36
Репутация
0
Как можно определить, что окно уже не активно, но не скрыто и не свёрнуто, то есть окно видно?
Например фокус с окна пропадает, если нажать на панель задач.
Надо, чтобы только в этот момент цвет фона окна менялся в этом примере.
При пропадании окна из вида, фон не должен меняться.

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <MsgBoxConstants.au3>
#include <ColorConstants.au3>

Opt("GUIOnEventMode", 1)

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Форма 1", 320, 240, -1, -1)

GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit')

GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

GUIRegisterMsg($WM_ACTIVATE, '_WM_ACTIVATE')

While 1
    Sleep(500)
WEnd

Func _WM_ACTIVATE($hWnd, $Msg, $wParam, $lParam)
    If $wParam = 0 Then
        GUISetBkColor($COLOR_SILVER)
    Else
        GUISetBkColor(0xF0F0F0)
    EndIf
EndFunc   ;==>WM_ACTIVATE

Func _Exit()
    MsgBox(0, 'Exit', 'Окно закрыто.')
    Exit
EndFunc
 

Norm

Продвинутый
Сообщения
291
Репутация
76
Без обработчика событий.
Код:
Opt("GUIOnEventMode", 1)
Global $nFl = 0

Global $Form1 = GUICreate("Форма 1", 320, 240, -1, -1)
GUISetOnEvent(-3, '_Exit') ; -3 = $GUI_EVENT_CLOSE
Global $iLb = GUICtrlCreateLabel("Окно активно", 100,50,150,20)
GUICtrlSetFont(-1, 12, 600)
GUISetState(@SW_SHOW)

While 1
    Sleep(100)
    If WinActive($Form1) = 0 Then
        If $nFl = 0 Then
            $nFl = 1
            _Win_State($nFl)
        EndIf
    Else
        If $nFl = 1 Then
            $nFl = 0
            _Win_State($nFl)
        EndIf
    EndIf
WEnd

Func _Win_State($nFl)
    GUICtrlSetData($iLb, "Окно "& ($nFl ? "НЕ " : "") &"активно")
    GUISetBkColor($nFl ? 0xEF2323 : 0xF0F0F0)
EndFunc

Func _Exit()
    GUICtrlSetData($iLb, "Окно активно")
    GUISetBkColor(0xF0F0F0)
    MsgBox(0, 'Exit', 'Окно закрыто.')
    Exit
EndFunc
 
Последнее редактирование:
Автор
aptyp

aptyp

Новичок
Сообщения
36
Репутация
0

Norm​

Спасибо.

Но в Вашем примере окно не совсем так работает.

Надо, чтобы при полном скрытии окна за другие окна или сворачивании, цвет окна не менялся.
А при пропадании активности окна, то есть когда окно не активно, но не является скрытым или свёрнутым, цвет изменялся.

Как это проверить?

Про z-index что то примеров не нашлось. )
 

Norm

Продвинутый
Сообщения
291
Репутация
76
На ум пришло тоько такое решение
Код:
Opt("GUIOnEventMode", 1)
Global $LastFl = 0, $nFl = 0

Global $Form1 = GUICreate("Форма 1", 320, 240, -1, -1)
GUISetOnEvent(-3, '_Exit') ; -3 = $GUI_EVENT_CLOSE
GUICtrlSetFont(-1, 12, 600)

GUISetState(@SW_SHOW)


While 1
    Sleep(100)
    If WinActive($Form1) = 0 Then
        If $nFl = 0 Then
            $nFl = 1
            _Win_State($nFl)
        EndIf
    Else
        If $nFl = 1 Then
            $nFl = 0
            _Win_State($nFl)
        EndIf
    EndIf
WEnd

Func _Win_State($nFl)
    Local $aWList, $aMyW, $aNw
    If $nFl Then
        $aWList = WinList("[REGEXPTITLE:.+]")
        For $nN = 1 To $aWList[0][0]
            If WinActive($aWList[$nN][1]) Then
                $aMyW = WinGetPos($Form1)
                $aNw = WinGetPos($aWList[$nN][1])
                If $aNw[2] >= $aMyW[2] And $aNw[3] >= $aMyW[3] Then
                    If ($aNw[0]+$aNw[2] >= $aMyW[0]+$aMyW[2]) And ($aNw[0] <= $aMyW[0]) And ($aNw[1]+$aNw[3] >= $aMyW[1]+$aMyW[3]) And ($aNw[1] <= $aMyW[1]) Then
                        $nFl = 0
                    EndIf
                EndIf
                ExitLoop
            EndIf
        Next
    EndIf
    If $LastFl <> $nFl Then
        GUISetBkColor($nFl ? 0xEF2323 : 0xF0F0F0)
        $LastFl = $nFl
    EndIf
EndFunc

Func _Exit()
    GUISetBkColor(0xF0F0F0)
    MsgBox(0, 'Exit', 'Окно закрыто.')
    Exit
EndFunc
 
Автор
aptyp

aptyp

Новичок
Сообщения
36
Репутация
0
Большое спасибо.
Мощный пример.
 
Верх