#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 Скрипт Сигнализатора