Spray
Новичок
- Сообщения
- 17
- Репутация
- 2
Пролог
Задача
Решил доработать один свой сценарий. Его назначение — вежливо, но настойчиво заставлять пользователя отрывать пятую точку, чтобы уберечь его от геморроя. Принцип таков: есть таймер а-ля песочные часы; пока вы работаете, «песочек» сыпется; как только «песочек» заполнит выделенный ему «объём» (например, 50 минут), вылетает окно в полэкрана, мешающее нормально работать и предлагающее оторваться от рабочего места; в любой момент таймер можно «перевернуть», заблокировав компьютер, и тогда песочек посыпется обратно, раз в пять быстрее; как только песочек вернётся весь обратно, противное окно добреет и просит себя закрыть, чтобы вы могли продолжить работу; итого каждые пять минут работы принуждают к одной минуте отдыха.
Проблема
Мой алгоритм отлично работает, но не учитывает некоторые способы использования ПК, больше смахивающие на отдых, во время которых блокировка исключена, при этом пятая точка на свободе. В эту категорию входят просмотр фильмов и прослушивание музыки с лицезрением альбом-арта на экране монитора, что вполне реально практиковать лёжа на диване, вдали от компьютерного кресла.
Суть
Предложение
Чтобы решить проблему, возникла идея добавить в сценарий мониторинг окон: если на рабочем столе отображается хотя бы одно окно приложения (исключая медиаплееры), то сценарий всё так же должен считать, что вы работаете, ваши 50 минут истекают, а если вдруг все окна окажутся свёрнутыми, то часы должны «перевернуться», ибо это значит, что ваша попа отдыхает.
Вопрос
Как сделать такой вот мониторинг — постоянно контролировать, есть ли несвёрнутые окна, при этом не нагружать процессор и чтобы реакция была хорошая? Пробовал фильтровать список окон, возвращаемых функцией WinList(), но от регулярного опроса процессор захлёбывается. Быть может есть какой-то способ получить сигнал о том, что какое-либо окно изменило состояние и сканировать только в эти моменты?
Как я это примерно вижу:
В идеале, конечно, цикл с условием заменить бы на такую конструкцию:
Задача
Решил доработать один свой сценарий. Его назначение — вежливо, но настойчиво заставлять пользователя отрывать пятую точку, чтобы уберечь его от геморроя. Принцип таков: есть таймер а-ля песочные часы; пока вы работаете, «песочек» сыпется; как только «песочек» заполнит выделенный ему «объём» (например, 50 минут), вылетает окно в полэкрана, мешающее нормально работать и предлагающее оторваться от рабочего места; в любой момент таймер можно «перевернуть», заблокировав компьютер, и тогда песочек посыпется обратно, раз в пять быстрее; как только песочек вернётся весь обратно, противное окно добреет и просит себя закрыть, чтобы вы могли продолжить работу; итого каждые пять минут работы принуждают к одной минуте отдыха.
Проблема
Мой алгоритм отлично работает, но не учитывает некоторые способы использования ПК, больше смахивающие на отдых, во время которых блокировка исключена, при этом пятая точка на свободе. В эту категорию входят просмотр фильмов и прослушивание музыки с лицезрением альбом-арта на экране монитора, что вполне реально практиковать лёжа на диване, вдали от компьютерного кресла.
Суть
Предложение
Чтобы решить проблему, возникла идея добавить в сценарий мониторинг окон: если на рабочем столе отображается хотя бы одно окно приложения (исключая медиаплееры), то сценарий всё так же должен считать, что вы работаете, ваши 50 минут истекают, а если вдруг все окна окажутся свёрнутыми, то часы должны «перевернуться», ибо это значит, что ваша попа отдыхает.
Вопрос
Как сделать такой вот мониторинг — постоянно контролировать, есть ли несвёрнутые окна, при этом не нагружать процессор и чтобы реакция была хорошая? Пробовал фильтровать список окон, возвращаемых функцией WinList(), но от регулярного опроса процессор захлёбывается. Быть может есть какой-то способ получить сигнал о том, что какое-либо окно изменило состояние и сканировать только в эти моменты?
Как я это примерно вижу:
Код:
while True
if все_окна_свёрнуты () then
$состояние = $ОТДЫХ ; таймер пойдёт обратно
else
$состояние = $РАБОТА ; таймер пойдёт прямо
endif
Sleep ($НЕ_СЛИШКОМ_БОЛЬШОЙ_ПЕРИОД)
wend
func все_окна_свёрнуты ()
??? ; не слишком ресурсоёмкий алгоритм (WinList буксует)
endfunc
В идеале, конечно, цикл с условием заменить бы на такую конструкцию:
Код:
GUIRegisterMsg (???, "callback")
func callback ($hWnd, $iMsgID, $wParam, $lParam)
switch $wParam
case ??? ; какое-то окно изменило состояние
if все_окна_свёрнуты () then …
endswitch
endfunc