检测用户活动

时间:2011-03-09 11:12:33

标签: c# windows

我需要创建一个监视计算机活动的程序。如鼠标移动,鼠标点击或键盘输入。我不需要记录计算机正在使用中发生的事情。如果他们的计算机在一段时间内没有被使用,即15分钟,我需要发射一个事件。

有没有办法让我收到这些事件的通知?

3 个答案:

答案 0 :(得分:8)

检查可以获取计算机空闲时间的this article,然后您可以在任意条件下触发事件。

伪代码:

If Computer_is_Idle > 15 minutes Then
    Do this
Else
    Do that or Wait more...

注意:文章中提供的源代码。

答案 1 :(得分:8)

谢谢LordCover。此代码来自here。该类可以为您控制键盘和鼠标控件。你可以在这样的计时器中使用:

private void timer1_Tick(object sender, EventArgs e)
{
    listBox1.Items.Add(Win32.GetIdleTime().ToString());
    if (Win32.GetIdleTime() > 60000) // 1 minute
    {
        textBox1.Text = "SLEEPING NOW";
    }
}

控制的主要代码。粘贴到您的表单代码。

internal struct LASTINPUTINFO
{
    public uint cbSize;
    public uint dwTime;
}

public class Win32
{
    [DllImport("User32.dll")]
    public static extern bool LockWorkStation();

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

    [DllImport("Kernel32.dll")]
    private static extern uint GetLastError();

    public static uint GetIdleTime()
    {
        LASTINPUTINFO lastInPut = new LASTINPUTINFO();
        lastInPut.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut);
        GetLastInputInfo(ref lastInPut);

        return ((uint)Environment.TickCount - lastInPut.dwTime);
    }

    public static long GetLastInputTime()
    {
        LASTINPUTINFO lastInPut = new LASTINPUTINFO();
        lastInPut.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut);
        if (!GetLastInputInfo(ref lastInPut))
        {
            throw new Exception(GetLastError().ToString());
        }

        return lastInPut.dwTime;
    }
}

答案 2 :(得分:0)

您需要设置全局键盘挂钩和全局鼠标挂钩。这将导致所有键盘和鼠标活动传递到您的应用程序。你可以记住最后一次这样的事件发生的时间,并定期检查你的例子是否超过你的例子15分钟。

查看here示例项目。您可能还会发现this有用。