Что нового

Режим бездействия пользователя

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Версия AutoIt: 3.3.6.1

Описание:
Помогите, пожалуйста, реализовать функцию, которая реагирует на бездействие пользователя (в течение определенного времени не нажата ни одна клавиша, не выполнен щелчок кнопкой мыши, не выполнено перемещение мыши)...

Примечания:
Желательно, чтобы реакцию на нажатие клавиши, на щелчок кнопкой мыши, на перемещение мыши можно было независимо включать и отключать...
Желательно, чтобы можно было установить чувствительность перемещения мыши, то есть, при "незначительном" (неинтенсивном) перемещении реакция не происходила...

Прошу откликнуться всех, кому интересна данная тема...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
#Include <WinAPIEx.au3>

While 1
	ConsoleWrite('Idle time (ms): ' & _WinAPI_GetIdleTime() & @CR)
	Sleep(1000)
WEnd
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Yashied
Если не учитывать пожелания, то функция делает то, что нужно...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
snoitaleR
мониторинг нажимания клавиш можно организовать с помощью
Код:
_IsPressed

в цикле, с перебором всех клавиш
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
snoitaleR сказал(а):
Если не учитывать пожелания, то функция делает то, что нужно...

А усли учитывать пожелания, то скорее всего все сведется к написанию Hook'а, что я собственно не советую делать без острой необходимости, и тем более в AutoIt.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Kaster сказал(а):
snoitaleR
мониторинг нажимания клавиш можно организовать с помощью
Код:
_IsPressed

в цикле, с перебором всех клавиш
Вот всё время думал, почему бы не сделать в _IsPressed параметр All, чтобы не перебирать все клавиши :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Garrett, _IsPressed(), это из UDF, т.е. пользовательская функция. Любой может написать улучшенную функцию _IsPressedEx() и в Open Feature Requests на офф. форум (может рассмотрят) или у нас.

:smile:



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

CreatoR как всегда, впереди планеты всей.

:smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
OffTopic:
Yashied
Может стоит отключить в настройках профиля опцию «Не предупреждать о появившихся ответах во время написания собственного сообщения»? :whistle:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
CreatoR
Спасибо за ссылку!
Yashied
Да вы правы, в принципе можно и самому подкорректировать!
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Компенсацию на небольшое перемещение мыши можно сделать например так:

Код:
#Include <WinAPIEx.au3>

$dX = 5
$dY = 5

$pIdle = _WinAPI_GetIdleTime()
$pMouse = MouseGetPos()

While 1
	$Idle = _WinAPI_GetIdleTime()
	If $Idle < $pIdle Then
		$Mouse = MouseGetPos()
		If (_IsAnyPressed()) Or (Abs($Mouse[0] - $pMouse[0]) > $dX) Or (Abs($Mouse[1] - $pMouse[1]) > $dY) Then
			ConsoleWrite('Active' & @CR)
			$pMouse = $Mouse
		EndIf
	EndIf
	$pIdle = $Idle
    Sleep(100)
WEnd

Func _IsAnyPressed()

	Local $Ret

	For $i = 1 To 255
		Switch $i
			Case 0x0A, 0x0B, 0x0E To 0x0F, 0x16, 0x1A, 0x1C To 0x1F, 0x3A To 0x40, 0x5E, 0x88 To 0x8F, 0x97 To 0x9F, 0xB8 To 0xB9, 0xC1 To 0xDA, 0xE0, 0xE8
				ContinueLoop
			Case Else
				$Ret = DllCall('user32.dll', 'short', 'GetAsyncKeyState', 'int', $i)
				If (Not @error) And (BitAND($Ret[0], 0x8000)) Then
					Return 1
				EndIf
		EndSwitch
	Next
	Return 0
EndFunc   ;==>_IsAnyPressed
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Идеальное решение принципиально не существует...
Материала для работы вполне достаточно...
Спасибо всем за помощь... :smile:
 

kaznelson

Новичок
Сообщения
9
Репутация
0
Подскажите, а как сделать простое и незатейливое "дёрганьё" компьютера по времени простоя, безо всяких дополнительных возможностей?

Сейчас делаю так:
Код:
While 1
    $pos = MouseGetPos()
    MouseMove($pos[0]+1, $pos[1]+1, 0)
    $pos = MouseGetPos()
    MouseMove($pos[0]-1, $pos[1]-1, 0)
    Sleep(540000)
WEnd

Можно ли как-то прикрутить _Timer_GetIdleTime(), дабы мышь двигалась не каждые 9 минут, а после 9 минут простоя?

Версия AutoIt 3.3.6.1.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки кода необходимо заключать в соответствующий тег ([code]), а также большие выдержки текста помещайте под тег [spoiler], там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, Модератор форума.





Код:
While 1
	Sleep(1000)
	If _Timer_GetIdleTime() > 540000 Then
		$pos = MouseGetPos()
		MouseMove($pos[0] + 1, $pos[1] + 1, 0)
		$pos = MouseGetPos()
		MouseMove($pos[0] - 1, $pos[1] - 1, 0)
	EndIf
WEnd
 

kaznelson

Новичок
Сообщения
9
Репутация
0
Yashied
Благодарю.
Однако есть проблемка - если скринсейвер запускается раньше установленного в скрипте времени, то скомпилированный скрипт не срабатывает:

Код:
If WinExists (@ScriptName) Then Exit
AutoItWinSetTitle (@ScriptName)
#NoTrayIcon
#include <Timers.au3>
While 1
    Sleep(10000)
    If _Timer_GetIdleTime() > 540000 Then
        $pos = MouseGetPos()
        MouseMove($pos[0] + 1, $pos[1] + 1, 0)
        $pos = MouseGetPos()
        MouseMove($pos[0] - 1, $pos[1] - 1, 0)
    EndIf
WEnd
 

kaznelson

Новичок
Сообщения
9
Репутация
0
В общем, моих познаний не хватает понять, почему запуск скринсейвера мешает скрипту я не смог.

Сделал такую конструкцию с проверкой - посмотрите на предмет скрытых граблей, пожалуйста:

Код:
; Предотвращение возможности множественного запуска скрипта.
If WinExists (@ScriptName) Then Exit
AutoItWinSetTitle (@ScriptName)

; Скрыть в системной панели индикатор AutoIt.
#NoTrayIcon

; Подключить таймер простоя.
#AutoIt3Wrapper_Au3Check_Parameters= -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#include <Timers.au3>

; Объявление переменных + проверка времени простоя до запуска хранителя экрана (время в мсек).
$scrTimeTemp = RegRead("HKEY_CURRENT_USER\Control Panel\Desktop", "ScreenSaveTimeOut") * 1000
If $scrTimeTemp >= 1000 AND $scrTimeTemp <= 600000 Then
    $scrTime = $scrTimeTemp * 0.9
    $sleepTime = $scrTimeTemp / 60
Else
    $scrTime = 540000
    $sleepTime = 10000
EndIf

; Определение координат курсора мыши и сдвиг туда-обратно на единицу.
While 1
    Sleep($sleepTime)
    If _Timer_GetIdleTime() > $scrTime Then
        $pos = MouseGetPos()
        MouseMove($pos[0] + 1, $pos[1] + 1, 0)
        $pos = MouseGetPos()
        MouseMove($pos[0] - 1, $pos[1] - 1, 0)
    EndIf
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
kaznelson
Как я понимаю, Ваш скрипт должен не давать появляться заставке. Может проще прописать в реестре
Код:
If RegRead('HKEY_CURRENT_USER\Control Panel\Desktop', 'ScreenSaveActive') = '1' Then
	RegWrite('HKEY_CURRENT_USER\Control Panel\Desktop', 'ScreenSaveActive', 'REG_SZ', '0')
EndIf
 

kaznelson

Новичок
Сообщения
9
Репутация
0
madmasles
Как я понимаю, Ваш скрипт должен не давать появляться заставке.
Нет, в идеале он должен предотвратить блокировку пользователя по таймауту. Просто стандартный скринсэйвер как-то мешает выполнению скрипта - после его запуска не срабатывает _Timer_GetIdleTime().

Насчёт записи в реестр понятно, но хотелось бы этого избежать...
___
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
kaznelson
Лучше настройте windows, как необходимо:
*Отключить заставку
*Отключить запрос пароля после выключения заставки
*Отключить переход в спящий/ждущий режимы

kaznelson [?]
после его запуска не срабатывает _Timer_GetIdleTime()
Я часто пользуюсь этой функцией, уверен, работает всегда и очень хорошо.
Ошибка в чем-то другом.

Ни как не могу понять смысл вот этого блока, какая его задача?
Код:
$scrTimeTemp = RegRead("HKEY_CURRENT_USER\Control Panel\Desktop", "ScreenSaveTimeOut") * 1000
If $scrTimeTemp >= 1000 AND $scrTimeTemp <= 600000 Then
    $scrTime = $scrTimeTemp * 0.9
    $sleepTime = $scrTimeTemp / 60
Else
    $scrTime = 540000
    $sleepTime = 10000
EndIf



Может так попробовать:
Код:
#NoTrayIcon
#include <Timers.au3>

Local	$aPos
Global	$iScrTime = RegRead('HKEY_CURRENT_USER\Control Panel\Desktop', 'ScreenSaveTimeOut') * 1000

While 1
    If _Timer_GetIdleTime() > $iScrTime-5*1000 Then
        $aPos = MouseGetPos()
        MouseMove($aPos[0]+1, $aPos[1]+1, 0)
    EndIf
	Sleep(50)
WEnd


Суть: если время бездействия пользователя превышает время, когда должна запуститься заставка, минус 5 секунд - то переместить курсор мышки.
 
Верх