Обнаружение простоя пользователя (для каждого экземпляра приложения) - PullRequest
5 голосов
/ 15 февраля 2011

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

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

Есть предложения?

Ответы [ 3 ]

5 голосов
/ 15 февраля 2011

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

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

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

4 голосов
/ 15 февраля 2011

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

2 голосов
/ 15 февраля 2011

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

...