Как контролировать пользовательскую (не) активность в Windows? - PullRequest
2 голосов
/ 21 декабря 2009

Какой самый простой способ программной проверки того, используется ли конкретный компьютер с Windows в данный момент человеком?

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

Для пользователей Windows было бы весьма полезно иметь возможность видеть, набирают ли они или не перемещают мышь, или какой-либо другой эквивалентный показатель активности. Я уже рассмотрел использование класса System.Diagnostics.Process , чтобы узнать, запущены ли определенные процессы (онлайн-игры и другие приложения с большой пропускной способностью) и когда они были запущены. Я полагаю, что за последние полчаса был запущен какой-либо из общих процессов пользователя (firefox, iTunes и т. Д.), Разумно было бы поспорить, что в кресле что-то сидит в мешке с мясом. Обнаружив активность, я отправляю крошечный HTTP-запрос POST («Эй, я жив и делаю что-то!») На сервер, и веб-приложение, запущенное на моем компьютере с Linux, обновляется, чтобы показать, что пользователь активен.

Я рассмотрел вопрос об использовании IM-статуса, но разные IM-клиенты, похоже, имеют разные уровни интеграции с ОС - и люди, кажется, не обновляют их так, как хотелось бы. Как и все хорошие граждане Web 2.0, я использую Twitter, конечно. ;)

Отказ от ответственности: я парень из UNIX и Mac, который избегает Windows. Я возился с .NET в Mono, но никогда раньше не касался Win32 API. Будь нежным.

1 Ответ

3 голосов
/ 21 декабря 2009

Возможно, вы захотите взглянуть на GetLastInputInfo:

Функция GetLastInputInfo извлекает время последнего входного события.

Это функция Windows API, которую вы вызываете через interop :

[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);

[StructLayout( LayoutKind.Sequential )]
struct LASTINPUTINFO
{
    public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO));

    [MarshalAs(UnmanagedType.U4)]
    public int cbSize;    
    [MarshalAs(UnmanagedType.U4)]
    public UInt32 dwTime;
}

Редактировать: э-э, вы не указали в вопросе, какой язык вы используете, я просто предположил, что на основе .Net, так как вы ссылались System.Diagonstics.Process

...