检测用户活动

Sal*_*lly 10 c# windows

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

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

Ken*_*n D 8

查看本文可以获取计算机的空闲时间,然后您将在任意条件下触发事件.

伪代码:

If Computer_is_Idle > 15 minutes Then
    Do this
Else
    Do that or Wait more...
Run Code Online (Sandbox Code Playgroud)

注意:文章中提供了源代码.


小智 8

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

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

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*Jon 0

您需要设置全局键盘钩子和全局鼠标钩子。这将导致所有键盘和鼠标活动都传递到您的应用程序。您可以记住上次此类事件的时间,并定期检查自该时间以来是否已经过去超过 15 分钟。

请查看此处的示例项目。您可能还会发现很有用。

  • 基于 GetLastInputInfo 的解决方案通常更好,因为它不需要将挂钩代码注入每个进程。 (3认同)