Что нового

вкл выкл экрана по расписанию без реагирования на мышку\клавиатуру.

Encento

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

Описание: есть вот такие соображения -
Код:
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 >= '0800' 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

Нужно доделать чтоб при нажатии на клавиатуру или мышку экран не включался

Примечания:
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Re: вкл выкл экрана по расписанию без реагирования на мышку\\клавиатуру.

Encento
Установите низкоуровневый хук, после любого события вновь включайте или выключайте экран


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

Вот примерно так, я закомментировал хук для мыши, что бы с помощью нее можно было включить экран при тестинге.
Код:
#include<WinAPI.au3>
#include<WindowsConstants.au3>
Global Const $lciWM_SYSCommand = 274
Global Const $lciSC_MonitorPower = 61808
Global Const $lciPower_Off = 2
Global Const $lciPower_On = -1
Global $MonitorIsOff = False
;~ Local $hStM=DllCallbackRegister("__HookM","long","int;wparam;lparam"), _
		$hM=_WinAPI_GetModuleHandle(0)
;~ $hHookM=_WinAPI_SetWindowsHookEx($wh_mouse_ll,DllCallbackGetPtr($hStM),$hM)
Local $hStK=DllCallbackRegister("__HookK","long","int;wparam;lparam")
$hHookK=_WinAPI_SetWindowsHookEx($wh_keyboard_ll,DllCallbackGetPtr($hStK),$hM)
While 1
   If '' & @HOUR & @MIN >= '0800' And '' & @HOUR & @MIN <= '1800' Then
      If $MonitorIsOff Then
         _Monitor_ON()
      EndIf
   Else
      If Not $MonitorIsOff Then
         _Monitor_OFF()
      EndIf
   EndIf
   Sleep (120000)
WEnd
#cs
Func __HookM($Code,$wPar,$lPar)
	If $Code<0 Then Return _WinAPI_CallNextHookEx($hHookM,$Code,$wPar,$lPar)
	If BitAND($wPar,0xFFFF) Then
		_Monitor_OFF()
	EndIf
EndFunc
#ce
Func __HookK($Code,$wPar,$lPar)
	If $Code<0 Then Return _WinAPI_CallNextHookEx($hHookK,$Code,$wPar,$lPar)
	If BitAND($wPar,0xFFFF) Then
		_Monitor_OFF()
	EndIf
EndFunc

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]')
        DllCall('user32.dll', 'int', 'SendMessage', _
                                                    'hwnd', $Progman_hwnd, _
                                                    'int', $lciWM_SYSCommand, _
                                                    'int', $lciSC_MonitorPower, _
                                                    'int', $lciPower_Off)
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

Экран моргает при взаимодействии но выключается
 
Автор
E

Encento

Новичок
Сообщения
11
Репутация
0
Re: вкл выкл экрана по расписанию без реагирования на мышку\\клавиатуру.

Возникла такая проблема : на компе где запускается скрипт криво настроено время и поменять его нет возможности. в итоге оно задевает промежуток не с 08 00 до 21 00 а с 12 45 до 01 45 и скрипт не понимает переход время на другой день. Помогите подправить таймер :smile:
Код:
;Скрипт предназначен для гашения мониторов в шоуруме на ночь
;Имеет 2 параметра: время начала показа и время завершения в формате ЧЧММ
;По умолчанию 0800 и 2100 соответсвенно
;Также стартует и убивает плеер Scala (так как при работающем плеере мониторы отключаются некорректно)
;По кнопке F10 монитор должен зажечься, а скрипт прекратить работу

;#NoTrayIcon

;#include <Array.au3>

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

;Global $MonitorIsOff = False

Global $ProgName = 'InfoChannelPlayer5.exe'
Global $ProgPath = 'c:\Program Files\Scala\Player 5\'

Global $sMonOnBegin
Global $sMonOnEnd
;Global $sText = ''

;HotKeySet("{F11}", "_Monitor_OFF")
;HotKeySet("{F11}", "_ShowText")
;HotKeySet("{F10}", "_Monitor_ON")
HotKeySet("{F10}", "_Quit")
;HotKeySet("{Esc}", "_Quit")

;MsgBox(64, "Monitor On/Off", "Press F11 to turn off the monitor." & @LF & _
;                            "Press F10 to turn on the monitor back." & @LF & _
;                            "Press ESC to turn on the monitor and exit program.")


if $CmdLine[0] > 1 Then
   $sMonOnBegin = $CmdLine[1]
   $sMonOnEnd = $CmdLine[2]
Else
   $sMonOnBegin = '1245'
   $sMonOnEnd	= '0145'   
EndIf



While 1 
   If _MonitorMustOn() Then
	 If Not ProcessExists($ProgName) Then
		Run ($ProgPath & $ProgName, $ProgPath)
	 EndIf
	 _Monitor_ON()
   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

Func _ShowText()
   MsgBox(0,'',$sText)
EndFunc

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 _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 _MonitorMustOn() ;Or $MonitorIsOff = False

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

Func _Quit()
    _Monitor_ON()
    Exit
EndFunc

Func _MonitorMustOn()
   $sTime = @HOUR & @MIN
   Return (($sTime>= $sMonOnBegin) and ($sTime<$sMonOnEnd))
EndFunc

как я понимаю проблема тут -
Код:
Func _MonitorMustOn()
   $sTime = @HOUR & @MIN
   Return (($sTime>= $sMonOnBegin) and ($sTime<$sMonOnEnd))
EndFunc



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

Решил проблему так
Код:
Func _MonitorMustOn()
   $sTime = @HOUR & @MIN
   $sTimeEnd = '235959'
   $sTimeBegin = '0000'
   $result=false

   if $sMonOnEnd>$sMonOnBegin then
       $result = (($sTime>= $sMonOnBegin) and ($sTime<$sMonOnEnd))
   Else
       $result = ((($sTime>= $sMonOnBegin) and ($sTime<=$sTimeEnd)) or (($sTime>= $sTimeBegin) and ($sTime<$sMonOnEnd)))
   endif
   Return $result
EndFunc
 
Верх