Что нового

Отслеживание свернуто окно или нет

Encento

Новичок
Сообщения
11
Репутация
0
Версия AutoIt: 3.3.8

Описание: есть скрипт который стоит на телевизорах с (оп вин 7) он выключает монитор в 9 вечера и в 9 утра включает. там запушен плеер на котором играет различная реклама. но бывает что он сворачивается и приходится его разворачивать. нужно дописать скрипт чтоб он отслеживал свернуто окно или нет и при необходимости разворачивал его.

Примечания:
Код:
;#NoTrayIcon

Global Const $lciWM_SYSCommand = 274
Global Const $lciSC_MonitorPower = 61808
Global Const $lciPower_Off = 2
Global Const $lciPower_On = -1

Global $MonitorIsOff = False



While 1 

   If '' & @HOUR & @MIN >= '0845' And '' & @HOUR & @MIN <= '2100' Then
	  If $MonitorIsOff Then
		 _Monitor_ON()
	  EndIf
   Else
	  If Not $MonitorIsOff Then
		 _Monitor_OFF()
	  EndIf
   EndIf
   Sleep (120000)
WEnd


Func _Monitor_ON()
    $MonitorIsOff = False
    Local $Progman_hwnd = WinGetHandle('[CLASS:Progman]')

    DllCall('user32.dll', 'int', 'SendMessage', _
                                                'hwnd', $Progman_hwnd, _
                                                'int', $lciWM_SYSCommand, _
                                                'int', $lciSC_MonitorPower, _
                                                'int', $lciPower_On)
EndFunc

Func _Monitor_OFF()
    $MonitorIsOff = True
    Local $Progman_hwnd = WinGetHandle('[CLASS:Progman]')

;    While $MonitorIsOff = True
;	Цикл нужен, если нас беспокоит включение от мыши/клавы, а в нашем случае их нет :)
        DllCall('user32.dll', 'int', 'SendMessage', _
                                                    'hwnd', $Progman_hwnd, _
                                                    'int', $lciWM_SYSCommand, _
                                                    'int', $lciSC_MonitorPower, _
                                                    'int', $lciPower_Off)
 ;       _IdleWaitCommit(0)
 ;       Sleep(20)
 ;   WEnd
EndFunc

Func _IdleWaitCommit($idlesec)
    Local $iSave, $LastInputInfo = DllStructCreate ("uint;dword")
    DllStructSetData ($LastInputInfo, 1, DllStructGetSize ($LastInputInfo))
    DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))

    Do
        $iSave = DllStructGetData ($LastInputInfo, 2)
        Sleep(60)
        DllCall ("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr ($LastInputInfo))
    Until (DllStructGetData ($LastInputInfo, 2)-$iSave) > $idlesec Or $MonitorIsOff = False

    Return DllStructGetData ($LastInputInfo, 2)-$iSave
EndFunc
 

Whited

Знающий
Сообщения
79
Репутация
10
Скрипт на телевизорах??? ууууууууууууууууууу :laugh:

Код:
WinSetState
тебе в помощь
 
Автор
E

Encento

Новичок
Сообщения
11
Репутация
0
видеопанель, сути это не меняет
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Encento,
Поменяйте '[CLASS:Notepad]' на свой.
Код:
For $i = 1 To Random(5, 15, 1)
	Run('notepad.exe', '', @SW_MINIMIZE)
Next
Sleep(500)
ConsoleWrite('Восстановлено окон [CLASS:Notepad]: ' & _Restore_All_minimized_Windows('[CLASS:Notepad]') & ' штук.' & @LF)


Func _Restore_All_minimized_Windows($s_Class)
	Local $a_WinList = WinList($s_Class)

	If Not $a_WinList[0][0] Then Return $a_WinList[0][0]
	For $i = 1 To $a_WinList[0][0]
		If BitAND(WinGetState($a_WinList[$i][1]), 16) Then WinSetState($a_WinList[$i][1], '', @SW_RESTORE)
	Next
	Return $a_WinList[0][0]
EndFunc   ;==>_Restore_All_minimized_Windows
 
Автор
E

Encento

Новичок
Сообщения
11
Репутация
0
Возникла проблема, на том компе невозможно узнать "CLASS" есть ли возможность без этого реализовать скрипт?( и почему на вашем примере Нотепада он открывает их 10-12 окон?) к примеру чтоб он просто все окна разворачивал а не конкретное
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Encento
А так?
Код:
;..........................................................
Func _Monitor_ON()
    $MonitorIsOff = False
    Local $Progman_hwnd = WinGetHandle('[CLASS:Progman]')
	WinSetState($Progman_hwnd, "", @SW_MAXIMIZE); добавлено
	Sleep(100) ; добавлено
	DllCall('user32.dll', 'int', 'SendMessage', ;..........
	;......................................................
 
Автор
E

Encento

Новичок
Сообщения
11
Репутация
0
а если просто сделать чтоб он посылал alt+tab ?(окно может развернуться но свернуться нет)


Добавлено:
Сообщение автоматически объединено:

Всем спасибо,Решил проблему так:
Код:
While 1 
   If _MonitorMustOn() Then
	 If Not ProcessExists($ProgName) Then
		Run ($ProgPath & $ProgName, $ProgPath)
	 EndIf
	 _Monitor_ON()
	 Sleep(5000)
	  Send("    {ALT DOWN}{TAB}{ALT UP}")
   Else
	  Local $Progman_hwnd = WinGetHandle('[CLASS:Progman]')
	   
	  $PID = ProcessExists($ProgName)
	  If $PID<>0 Then
		 Send ('!{F4}')
;		 ProcessWaitClose($PID)		;Почему-то не работает
	  EndIf
	   
        DllCall('user32.dll', 'int', 'SendMessage', _
                                                    'hwnd', $Progman_hwnd, _
                                                    'int', $lciWM_SYSCommand, _
                                                    'int', $lciSC_MonitorPower, _
                                                    'int', $lciPower_Off)
        _IdleWaitCommit(0)
   EndIf
   Sleep (3000)
WEnd

добавил в этот цикл
Код:
Sleep(5000)
      Send("    {ALT DOWN}{TAB}{ALT UP}")
 
Верх