79

私は、ユーザーが最後にマシンを操作した時間を検出して、アイドル状態かどうかを判断する必要がある小さなトレイアプリケーションを作成しています。

ユーザーが最後にマウスを動かしたり、キーを押したり、何らかの方法でマシンを操作した時間を取得する方法はありますか?

Windowsは明らかにこれを追跡して、スクリーンセーバーを表示したり、電源を切ったりするタイミングを決定していると思います。したがって、これを自分で取得するためのWindows APIがあると思いますか?

4

3 に答える 3

74

GetLastInputInfoPInvoke.netで文書化されています。

于 2009-06-24T10:55:07.653 に答える
54

次の名前空間を含める

using System;
using System.Runtime.InteropServices;

そして、以下を含めます

internal struct LASTINPUTINFO 
{
    public uint cbSize;

    public uint dwTime;
}

/// <summary>
/// Helps to find the idle time, (in milliseconds) spent since the last user input
/// </summary>
public class IdleTimeFinder
{
    [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);
    }
/// <summary>
/// Get the Last input time in milliseconds
/// </summary>
/// <returns></returns>
    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;
    }
}

ティックカウントを時間に変換するには、使用できます

TimeSpan timespent = TimeSpan.FromMilliseconds(ticks);

ノート。このルーチンは TickCount という用語を使用しますが、値はミリ秒単位であるため、Ticks とは異なります。

Environment.TickCount に関する MSDN の記事から

システムが起動してから経過したミリ秒数を取得します。

于 2012-08-10T12:30:45.477 に答える
0

コード:

 using System;
 using System.Runtime.InteropServices;

 public static int IdleTime() //In seconds
    {
        LASTINPUTINFO lastinputinfo = new LASTINPUTINFO();
        lastinputinfo.cbSize = Marshal.SizeOf(lastinputinfo);
        GetLastInputInfo(ref lastinputinfo);
        return (((Environment.TickCount & int.MaxValue) - (lastinputinfo.dwTime & int.MaxValue)) & int.MaxValue) / 1000;
    }
于 2016-12-27T10:40:02.673 に答える