什么是最简单的方法来编程检查一个特定的Windows机器当前正在被人类使用?
我正在考虑为我们相当有限的互联网连接写一个“礼貌监视器”,这基本上是一种在任何时候都能看到谁正在使用互联网的方式,所以当有人需要下载一个大文件时,他们可以最大限度地减less烦恼到其他人(并且历史地保存这些统计数据,所以可以预测上行链路何时不会太滞后)。 我试图收集多个证据来源,然后用它来推断活动。
对于Windows用户,能够看到他们是否正在键入或移动鼠标或其他一些等同的活动措施是非常有用的。 我已经考虑使用System.Diagnostics.Process类来查看某些进程是否正在运行(在线游戏和其他带宽大的应用程序)以及何时启动。 我想,如果在过去的半小时内推出了一堆常见的用户级进程(firefox,iTunes等),那么合理的select就是坐在椅子上的肉袋做一些事情。 一旦我检测到活动,就会向服务器发送一个很小的HTTP POST请求(说“嗨,我还活着,做点什么!”),并且运行在我的Linux机器上的一个web应用程序得到更新,以显示用户处于活动状态。
我已经考虑过使用即时通讯状态,但不同的即时消息客户端似乎有不同的操作系统集成级别 – 人们似乎并没有更新那些更好的。 像所有优秀的Web 2.0公民一样,我当然使用Twitter。 ;)
免责声明:我是一个UNIX和Mac的人避免Windows。 我已经在Mono里弄了.NET,但之前从未碰过Win32 API。 要温柔。
你可能想看看GetLastInputInfo
:
GetLastInputInfo
函数检索上次输入事件的时间。
这是一个你可以通过interop调用的Windows API函数:
[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