Страница 1 из 1

Добавлено: 14 Октябрь 2004, 9:42
Гость
Привет всем !

Интересно, можно ли заставить программу принудительно завершиться, если пользователь не касается мыши и клавы в течение энного количества времени ?

Понятно, что нужно отслеживать при этом, что не запущено каких-нибудь длительных процессов.

Есть ли идеи ?

С уважением
Евгений Григоров
grig@parfume.omskcity.com
Написал: ClaList(2)

Добавлено: 14 Октябрь 2004, 10:48
Гость
Подзадача №1. Определить, что приложение не управляется интерактивно пользователем в течении определенного количества времени.

Для решения этой задачи создается системных хук (см. Windows API SetWindowsHookEx), который мониторит события связанные с клавиатурой и мышкой для процесса, который этот хук установил. Потребуется изучить материал на тему "System hooks в Windows".

Хук должен иметь свое окно и внутренний таймер (или опираться на таймер главного окна приложения), который отсчитывает время от последнего интерактива пользователя, как только время пришло, посылает событие , назовем его "событие простоя" (с периодичностью в 1 минуту, например) в главное окно приложения.

Подзадача №2. Реакция главного окна приложения на "событие простоя".

Главное окно, получив "событие простоя" должно уже решить чего ему делать. Для начала все процессы которые могут иметь длительный характер видимо должны устанавливать некий флаг, что они работают. Ну например, во все процедуры PROCESS и REPORT (до вызова Previewer-a) вставить инициализацию этого флага, проще всего написать простенький шаблон для этого.
Соответственно пока флаг взведен "событие простоя" игнерируется.

Если главное окно принимает решение, что пора закрываться проверяет есть ли какие-нить потоки кроме потока главного окна, если есть, то посылаем им EVENT:CloseWindow и ждет новой посылки "события простоя". Если в момент очередного получения события простоя уже нет ни одного потока, кроме потока главного окна, посылаем себе EVENT:CloseWindow.

Остается еще масса вопросов, что делать например, если пользователь вводил какие-нить данные в форму. В этом случае форма будет закрываться и при закрытии спросит пользователя что делать с данными "Сохранять?" Решения могут быть разные, можно просто оставить такое приложение в покое, считая, что если поток не закрылся при посылке ему EVENT:CloseWindow, то он требует какой-то реакции пользователя и не простаивает. Можно эту реакцию пользователя обеспечить самостоятельно (взяв всю ответственность за недостоверность данных на себя :)), но для этого придется видимо заменить стандартный MESSAGE на свой. Сделать это достаточно просто: либо использовать PROP:MessageHook, либо подменить NAME для MESSAGE из BUILTINS.CLW на свой.

Удачи!
__________________________________
Владимир Якимченко (IСQ 16 993 194)
Написал: ClaList(2)