Что нового

Можно ли отследить бездействие системы?

agikon

Знающий
Сообщения
789
Репутация
17
вот интересно можно ли как-то отследить бездействие системы?
например если на потяжении 10 минут не нажималась никакая кнопка на клавиатуре то посылалась команда shutdown

можно как-то отследить?
подскажите пожалуйста.
очень бы хороший скрипт получился бы по выключению пк.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
agikon
можно использовать
Код:
MouseGetPos
и
Код:
_IsPressed
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Уже было на форуме.
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
Александр
а как сделать запись с
Код:
_IsPressed

если 10 минут не нажималась никакая кнопка клавиатуры?

Yashied
ну темы есть но там я вижу только как отследить мышу через _WinAPI_GetIdleTime()

а вот как клавиатуру?
если например 10 минут не нажималась клавиша. потому что мыша это ненадёжно, какаято вибрация и сдвинется на 1 пиксель и всё уже считается движение, а вот клавиша сама не нажмётся.
 

ArtInt

Знающий
Сообщения
135
Репутация
18
Бездействие системы
Отслеживается через специальный процесс (см. диспетчер задач)

А это бездействие пользователя. Можно назначить Hotkey'и на все клавиши?.. ;D

Честно, в AutoIt'е вроде плохо с отслеживанием нажатых клавиш :'(
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
ArtInt [?]
Честно, в AutoIt'е вроде плохо с отслеживанием нажатых клавиш
Если не знаешь, лучше не пиши.

Вот старый пример от amel27 (изменённый мной позже), вроде ещё работает:

Код:
#include <Date.au3>

HotKeySet("{ESC}", "_Quit")

$IdleMinimum = 50 ; допустимый период неактивности в миллисекундах

While 1
	$iIdle = _IdleWaitStart($IdleMinimum)
	ConsoleWrite(_Now() & ' ' & @UserName & ' неактивен уже ' & _TickToTimeString($iIdle) & @CRLF)
	$iIdle = _IdleWaitCommit($IdleMinimum)
	ConsoleWrite(_Now() & ' ' & @UserName & ' был неактивен ' & _TickToTimeString($iIdle) & @CRLF)
WEnd

; Ожидание начала бездействия пользователя.
; Возвращает время неактивности (в тиках)
; $idlesec - минимальная длительность ожидаемой неактивности (в тиках)
Func _IdleWaitStart($idlesec)
	Local $aRet, $iSave, $iTick, $LastInputInfo = DllStructCreate("uint;dword")
	DllStructSetData($LastInputInfo, 1, DllStructGetSize($LastInputInfo))
	DllCall("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr($LastInputInfo))
	
	Do
		Sleep(200)
		$iSave = DllStructGetData($LastInputInfo, 2)
		DllCall("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr($LastInputInfo))
		$aRet = DllCall("kernel32.dll", "long", "GetTickCount")
	Until ($aRet[0] - DllStructGetData($LastInputInfo, 2)) > $idlesec
	
	Return $aRet[0] - DllStructGetData($LastInputInfo, 2)
EndFunc   ;==>_IdleWaitStart

; Ожидание окончания бездействия пользователя.
; Возвращает время неактивности в (тиках)
; $idlesec - минимальная длительность ожидаемой неактивности в (тиках)
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(200)
		DllCall("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr($LastInputInfo))
	Until (DllStructGetData($LastInputInfo, 2) - $iSave) > $idlesec
	
	Return DllStructGetData($LastInputInfo, 2) - $iSave
EndFunc   ;==>_IdleWaitCommit

Func _TickToTimeString($iTicks)
	Local $iHours, $iMins, $iSecs, $sText = ''
	_TicksToTime($iTicks, $iHours, $iMins, $iSecs)
	
	If $iHours Then $sText = $iHours & ' часов '
	If $iMins Then $sText &= $iMins & ' минут '
	If $iSecs Then $sText &= $iSecs & ' секунд'
	If $sText = '' Then $sText = 'меньше секунды'
	
	Return $sText
EndFunc   ;==>_TickToTimeString

Func _Quit()
	Exit
EndFunc   ;==>_Quit
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
сделал вот так, кажись работает отлично :ok:

Код:
#include <Date.au3>

$IdleMinimum = 600000;  10 минут

While 1
	$iIdle = _IdleWaitStart($IdleMinimum)
	if $iIdle > 600000 then
		MsgBox(64, 'Info', 'Выключено !', '')
		;shutdown
	else
	endif
WEnd

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

    Do
        Sleep(200)
        $iSave = DllStructGetData($LastInputInfo, 2)
        DllCall("user32.dll", "int", "GetLastInputInfo", "ptr", DllStructGetPtr($LastInputInfo))
        $aRet = DllCall("kernel32.dll", "long", "GetTickCount")
    Until ($aRet[0] - DllStructGetData($LastInputInfo, 2)) > $idlesec

    Return $aRet[0] - DllStructGetData($LastInputInfo, 2)
EndFunc   ;==>_IdleWaitStart


CreatoR
спасибо!
это именно то что надо!
 
Верх