如何监控Windows中的用户(in-)活动?

时间:2009-12-21 04:38:08

标签: windows monitoring android-activity

以编程方式检查特定Windows机器目前是否正在被人类使用的最简单方法是什么?

我正在考虑为我们相当有限的互联网连接编写一个“礼貌监控器” - 基本上是一种查看当前谁正在积极使用互联网的方式,所以当有人需要下载大文件时,他们可以最大限度地减少对他人的烦恼(并保持历史上的统计数据,因此可以预测上行链路何时不会太滞后)。我正在尝试收集多种证据来源,然后可以用来推断活动。

对于Windows用户,能够查看他们是否正在键入或移动鼠标或其他一些等效的活动量是非常有用的。我已经考虑使用System.Diagnostics.Process类来查看某些进程是否正在运行(在线游戏和其他带宽繁重的应用程序)以及它们何时启动。我想如果在过去的半小时内推出了许多常见的用户流程(firefox,iTunes等)中的任何一个,那么合理的赌注就是坐在椅子上做一些东西。一旦我检测到活动,我就会向服务器发送一个微小的HTTP POST请求(说“嘿,我还活着并做某事!”),并且我的Linux机器上运行的webapp会更新,以显示用户是否处于活动状态。

我考虑使用IM状态,但是不同的IM客户端似乎有不同级别的操作系统集成 - 人们似乎并没有那么好的更新。像所有优秀的Web 2.0公民一样,我当然也在使用Twitter。 ;)

免责声明:我是一个避免使用Windows的UNIX和Mac用户。我已经在Mono中摆弄了.NET,但之前从未接触过Win32 API。要温柔。

1 个答案:

答案 0 :(得分:3)

您可能需要查看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;
}

编辑:呃,你没有在问题中指明你使用的是哪种语言,因为你引用了System.Diagonstics.Process

,我只假设.Net