Что нового

Нужна программа отслеживающая изменение цвета на мониторе.

rem24

Новичок
Сообщения
15
Репутация
0
Добрый день. Нужна программа отслеживающая изменение цвета на мониторе. Есть программа которая постоянно работает и занимает верхнюю часть монитора. В данной программе есть несколько окошек (1-6), при нормальной работе они горят зелёным цветом, если возникает неисправность цвет изменяется на красный. Нужна программа которая будет подавать сигнал (звуковой и графический) о том что произошло изменение цвета. На форуме видел похожую тему, может кто сможет адаптировать код под мои нужды?

1While 1
2PixelSearch(0, 0, 100, 300, 0xFF0000, 50, 3) ; координаты области, цвет, допущение оттенка, шаг поиска
3If Not @error Then
4MsgBox(0, "Сообщение", "Найден красный цвет!", 5) ; Действие
5EndIf
6Sleep(2000)
7WEnd
 

Webarion

Осваивающий
Сообщения
143
Репутация
24
Как-то так:
Код:
#Region Имитируем программу изменяющую цвета. Этот регион можно поместить в отдельный скрипт
    #include <WindowsConstants.au3>
    Local $iControlsGen = 6 ; количество генерируемых контролов
    Local $iFormW = (75 * $iControlsGen) + 5
    Local $hForm = GUICreate("ColorGenerator", $iFormW, 80, @DesktopWidth - $iFormW - 50, 50, -1, $WS_EX_TOPMOST); форма сверху всех
    For $i = 1 To $iControlsGen
        Local $iLB = GUICtrlCreateLabel(' Control' & $i, 5 + (($i - 1) * 75), 5, 70, 70)
        GUICtrlSetBkColor(-1, 0x00FF00)
        Assign('iLabel' & $i, $iLB); записываем переменную контрола
    Next
    GUISetState(@SW_SHOW)
    AdlibRegister('_GenerateColor', 500)
    Func _GenerateColor()
        Local $iRnd = Random(0, 100, 1)
        Local $iColor = $iRnd > 90 ? 0xFF0000 : 0x00FF00
        Local $iRndLabel = Random(1, $iControlsGen, 1)
        Execute('GUICtrlSetBkColor($iLabel' & $iRndLabel & ', $iColor)')
    EndFunc

    ; следующий закомментированный код, при использовании региона, в отдельном скрипте нужно раскомментировать
;~     While 1
;~         $nMsg = GUIGetMsg()
;~         Switch $nMsg
;~             Case -3
;~                 Exit
;~         EndSwitch
;~     WEnd
#EndRegion Имитируем программу изменяющую цвета. Этот регион можно поместить в отдельный скрипт


#Region Скрипт Сигнализатора
    #include <GuiConstants.au3>

    AutoItSetOption("PixelCoordMode", 2) ; будем искать относительно клиентских координат окна

    Global $iControls = 6 ; количество ослеживаемых контролов
    Global $iWarningHideTime = 2000 ; Если все не красные, то через это время(в мс.) информационная форма автоматически скроется; 0 - не скрывать форму
    Global $iColorWarning = 0xFF0000 ; цвет сработки

    Global $sAudioPath = @WindowsDir & "\media\tada.wav" ; путь к аудио файлу

    ; координаты контролов в клиентской области окна. Можно узнать через программу Control Viewer
    ; либо координаты мест, которые будут сканироваться. Правила координат области: [Слева, Сверху, Ширина, Высота]
    Global $aPosCtrl1 = [5, 5, 70, 70]
    Global $aPosCtrl2 = [80, 5, 70, 70]
    Global $aPosCtrl3 = [155, 5, 70, 70]
    Global $aPosCtrl4 = [230, 5, 70, 70]
    Global $aPosCtrl5 = [305, 5, 70, 70]
    Global $aPosCtrl6 = [380, 5, 70, 70]
    ;---

    ; ========================================================================================
    ; Demo форма, которая будет появляться, когда в контролах генератора появляется красный
    Global $hThisForm = GUICreate("ColorWarning", 200, 200, -1, -1, -1, $WS_EX_TOPMOST) ; поверх всех
;~     Global $hThisForm = GUICreate("ColorWarning", 200, 200, -1, -1, $WS_POPUP, $WS_EX_TOPMOST) ; без рамки, поверх всех
    ;    создаём информационные Label, по указанному количеству
    For $i = 1 To $iControls
        Local $iLB = GUICtrlCreateLabel('' & $i, 2, 2 + (($i - 1) * 27), 196, 25, $SS_CENTERIMAGE)
        GUICtrlSetFont(-1, 12, 700, 0) ; Жирный шрифт
        Assign('iThisLabel' & String($i), $iLB, 2); записываем переменную контрола в глобальную область видимости
    Next
    GUISetState(@SW_HIDE, $hThisForm)
    ; ========================================================================================

    Global $hFormColorGen = WinGetHandle("ColorGenerator") ; получаем дескриптор нужного окна

    Global $iTrigAudio = 0, $iTimer = 0 ; рабочие переменные

    AdlibRegister('IsWarning', 50) ; отправляем на проверку каждые 50 мс.

    While 1
        If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
        Sleep(10)
    WEnd


    Func IsWarning()
        Local $iColors = 0
        For $i = 1 To $iControls
            If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit

            If IsHWnd($hFormColorGen) Then

                Local $aPos = Eval('aPosCtrl' & $i)
                If UBound($aPos) = 4 Then

                    Local $aIsPixels = PixelSearch($aPos[0], $aPos[1], $aPos[0] + $aPos[2], $aPos[1] + $aPos[3], $iColorWarning, 0, 1, $hFormColorGen) ; координаты области, цвет, допущение оттенка, шаг поиска. Настройте сами под свой маяк
                    Local $iCtrl = Eval('iThisLabel' & $i)

                    If UBound($aIsPixels) Then ; если красный
                        GUICtrlSetData($iCtrl, ' Control' & $i & ' - Внимание')
                        GUICtrlSetBkColor($iCtrl, 0xFF0000)
                        $iColors += 1
                    Else
                        GUICtrlSetData($iCtrl, ' Control' & $i & ' - Норма')
                        GUICtrlSetBkColor($iCtrl, 0x00FF00)
                    EndIf

                EndIf

            EndIf
            Sleep(20)
        Next

        If $iColors Then
            Local $iState = WinGetState($hThisForm)
            If BitAND($iState, 16) Then GUISetState(@SW_RESTORE, $hThisForm)
            If Not $iTrigAudio Then
                _Audio()
                $iTrigAudio = 1
                $iTimer = 0
                AdlibUnRegister('_HideForm')
            EndIf
            If Not BitAND($iState, 2) Then GUISetState(@SW_SHOW, $hThisForm)
        Else
            $iTrigAudio = 0
            _TimerHide()
        EndIf

    EndFunc

    Func _TimerHide()
        If Not $iTimer And $iWarningHideTime Then
            $iTimer = 1
            AdlibRegister('_HideForm', $iWarningHideTime); автоскрытие
        EndIf
    EndFunc

    Func _HideForm()
        AdlibUnRegister('_HideForm')
        GUISetState(@SW_HIDE, $hThisForm)
    EndFunc

    Func _Audio()
        If FileExists($sAudioPath) Then
            SoundPlay($sAudioPath)
        Else
            ConsoleWrite('! Not audio file: ' & $sAudioPath & @CRLF)
        EndIf
;~             Beep(350, 800) ; или так
    EndFunc

#EndRegion Скрипт Сигнализатора
 
Последнее редактирование:
Автор
R

rem24

Новичок
Сообщения
15
Репутация
0
Как-то так:
Код:
#Region Имитируем программу изменяющую цвета. Этот регион можно поместить в отдельный скрипт
    #include <WindowsConstants.au3>
    Local $iControlsGen = 6 ; количество генерируемых контролов
    Local $iFormW = (75 * $iControlsGen) + 5
    Local $hForm = GUICreate("ColorGenerator", $iFormW, 80, @DesktopWidth - $iFormW - 50, 50, -1, $WS_EX_TOPMOST); форма сверху всех
    For $i = 1 To $iControlsGen
        Local $iLB = GUICtrlCreateLabel(' Control' & $i, 5 + (($i - 1) * 75), 5, 70, 70)
        GUICtrlSetBkColor(-1, 0x00FF00)
        Assign('iLabel' & $i, $iLB); записываем переменную контрола
    Next
    GUISetState(@SW_SHOW)
    AdlibRegister('_GenerateColor', 500)
    Func _GenerateColor()
        Local $iRnd = Random(0, 1, 1)
        Local $iColor = $iRnd ? 0xFF0000 : 0x00FF00
        Local $iRndLabel = Random(1, $iControlsGen, 1)
        Execute('GUICtrlSetBkColor($iLabel' & $iRndLabel & ', $iColor)')
    EndFunc

    ; следующий закомментированный код, при использовании региона, в отдельном скрипте нужно раскомментировать
;~     While 1
;~         $nMsg = GUIGetMsg()
;~         Switch $nMsg
;~             Case -3
;~                 Exit
;~         EndSwitch
;~     WEnd
#EndRegion Имитируем программу изменяющую цвета. Этот регион можно поместить в отдельный скрипт


#Region Скрипт Сигнализатора
    #include <GuiConstants.au3>

    AutoItSetOption("PixelCoordMode", 2) ; будем искать относительно клиентских координат окна

    Global $iControls = 6 ; количество ослеживаемых контролов
    Global $iWarningHideTime = 1000 ; Если все не красные, то через это время(в мс.) информационная форма автоматически скроется
    Global $iColorWarning = 0xFF0000 ; цвет сработки

    Global $sAudioPath = @WindowsDir & "\media\tada.wav" ; путь к аудио файлу

    ; координаты контролов в клиентской области окна. Можно узнать через программу Control Viewer
    ; либо координаты мест, которые будут сканироваться. Правила координат области: [Слева, Сверху, Ширина, Высота]
    Global $aPosCtrl1 = [5, 5, 70, 70]
    Global $aPosCtrl2 = [80, 5, 70, 70]
    Global $aPosCtrl3 = [155, 5, 70, 70]
    Global $aPosCtrl4 = [230, 5, 70, 70]
    Global $aPosCtrl5 = [305, 5, 70, 70]
    Global $aPosCtrl6 = [380, 5, 70, 70]
    ;---

    ; ========================================================================================
    ; Demo форма, которая будет появляться, когда в контролах генератора появляется красный
    Global $hThisForm = GUICreate("ColorWarning", 200, 200, -1, -1, -1, $WS_EX_TOPMOST) ; без рамки, поверх всех
;~     Global $hThisForm = GUICreate("ColorWarning", 200, 200, -1, -1, $WS_POPUP, $WS_EX_TOPMOST) ; без рамки, поверх всех
    ;    создаём информационные Label, по указанному количеству
    For $i = 1 To $iControls
        Local $iLB = GUICtrlCreateLabel('' & $i, 2, 2 + (($i - 1) * 27), 196, 25, $SS_CENTERIMAGE)
        GUICtrlSetFont(-1, 12, 700, 0) ; Жирный шрифт
        Assign('iThisLabel' & String($i), $iLB, 2); записываем переменную контрола в глобальную область видимости
    Next
    GUISetState(@SW_HIDE, $hThisForm)
    ; ========================================================================================

    Global $hFormColorGen = WinGetHandle("ColorGenerator") ; получаем дескриптор нужного окна

    Global $iTrigAudio = 0, $iTimer = 0 ; рабочие переменные

    AdlibRegister('IsWarning', 50) ; отправляем на проверку каждые 50 мс.

    While 1
        If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit
        Sleep(10)
    WEnd


    Func IsWarning()
        Local $iColors = 0
        For $i = 1 To $iControls
            If GUIGetMsg() = $GUI_EVENT_CLOSE Then Exit

            If IsHWnd($hFormColorGen) Then

                Local $aPos = Eval('aPosCtrl' & $i)
                If UBound($aPos) = 4 Then

                    Local $aIsPixels = PixelSearch($aPos[0], $aPos[1], $aPos[0] + $aPos[2], $aPos[1] + $aPos[3], $iColorWarning, 0, 1, $hFormColorGen) ; координаты области, цвет, допущение оттенка, шаг поиска. Настройте сами под свой маяк
                    Local $iCtrl = Eval('iThisLabel' & $i)

                    If UBound($aIsPixels) Then ; если красный
                        GUICtrlSetData($iCtrl, ' Control' & $i & ' - Внимание')
                        GUICtrlSetBkColor($iCtrl, 0xFF0000)
                        $iColors += 1
                    Else
                        GUICtrlSetData($iCtrl, ' Control' & $i & ' - Норма')
                        GUICtrlSetBkColor($iCtrl, 0x00FF00)
                    EndIf

                EndIf

            EndIf
            Sleep(20)
        Next

        If $iColors Then
            Local $iState = WinGetState($hThisForm)
            If BitAND($iState, 16) Then GUISetState(@SW_RESTORE, $hThisForm)
            If Not $iTrigAudio Then
                _Audio()
                $iTrigAudio = 1
                $iTimer = 0
                AdlibUnRegister('_HideForm')
            EndIf
            If Not BitAND($iState, 2) Then GUISetState(@SW_SHOW, $hThisForm)
        Else
            $iTrigAudio = 0
            _TimerHide()
        EndIf

    EndFunc

    Func _TimerHide()
        If Not $iTimer Then
            $iTimer = 1
            AdlibRegister('_HideForm', $iWarningHideTime); автоскрытие
        EndIf
    EndFunc

    Func _HideForm()
        AdlibUnRegister('_HideForm')
        GUISetState(@SW_HIDE, $hThisForm)
    EndFunc

    Func _Audio()
        If FileExists($sAudioPath) Then
            SoundPlay($sAudioPath)
        Else
            ConsoleWrite('! Not audio file: ' & $sAudioPath & @CRLF)
        EndIf
;~             Beep(350, 800) ; или так
    EndFunc

#EndRegion Скрипт Сигнализатора
Спасибо.
 
Верх