Обнаружение простоя пользователя (для каждого экземпляра приложения)

Мне нужно обнаружение простоя пользователя только в моем приложении (для "экземпляра моего приложения").
Я не могу использовать GetLastInputInfo, потому что это пользовательский ввод для сессии:

GetLastInputInfo не предоставляет общесистемную информацию о пользователях во всех запущенных сеансах. Скорее GetLastInputInfo предоставляет специфичную для сеанса информацию пользовательского ввода только для сеанса, который вызвал функцию.

Какие-либо предложения?

3 ответа

Решение

Вы могли бы использовать Application.AddMessageFilter и следить за сообщениями, представляющими взаимодействие с пользователем (например, мышь, клавиатура, возможно, активация меню).

Я предполагаю, что вы хотите обнаружить время простоя, но только когда ваше приложение активно. Затем вы должны точно определить, что вы подразумеваете под активностью приложения. Когда ваше приложение активно (по вашему собственному определению), вы можете через равные промежутки времени вызывать GetLastInputInfo, чтобы определить время простоя вашего приложения, когда оно активно (например, используя какой-то таймер).

В Windows есть концепция окна переднего плана, и текущее окно переднего плана может быть восстановлено с помощью GetForegroundWindow. Вы можете использовать GetWindowThreadProcessId, чтобы найти идентификатор процесса, которому принадлежит окно переднего плана. Если этот идентификатор процесса является вашим идентификатором процесса, вы знаете, что вы являетесь приоритетным процессом, даже если ваше приложение имеет несколько окон. Вы должны будете делать это обнаружение через регулярные промежутки времени так же, как вы должны проверять время простоя.

Вы не должны беспокоиться о GetLastInputInfo только предоставление информации о сеансе. Если несколько пользователей вошли в систему на одном и том же компьютере Windows, у каждого из них будет свой собственный сеанс, но другой пользователь, находящийся в режиме ожидания или не находящийся в режиме ожидания, не должен влиять на то, как вы обнаруживаете, что пользователь вашего приложения бездействует.

Если это приложение Windows Forms, вы можете создать обработчик неактивных событий и подписаться на событие Application.Idle. Вы получите уведомление, когда приложение завершит обработку и собирается перейти в состояние ожидания.

Другие вопросы по тегам