1

ユーザーが非アクティブであることを確認するにはどうすればよいですか? 私はこれを持っています:

class UserActivity : IMessageFilter
{
    private double afk_time = 0.1;//minutes
    private DateTime last_activity = DateTime.Now;
    public static bool inactive = false;

    private int WM_LBUTTONDOWN = 0x0201;
    private int WM_MBUTTONDOWN = 0x0207;
    private int WM_RBUTTONDOWN = 0x0204;
    private int WM_MOUSEWHEEL = 0x020A;
    private int WM_MOUSEMOVE = 0x0200;
    private int WM_KEYDOWN = 0x0100;

    public bool PreFilterMessage(ref Message m)
    {
        if (m.Msg == WM_LBUTTONDOWN || m.Msg == WM_MBUTTONDOWN || m.Msg == WM_RBUTTONDOWN || m.Msg == WM_MOUSEWHEEL || m.Msg == WM_MOUSEMOVE || m.Msg == WM_KEYDOWN)
        {
            this.last_activity = DateTime.Now;
            inactive = false;
        }

        if (DateTime.Now.AddMinutes(-afk_time) > last_activity)
            inactive = true;

        return false;
    }
}

しかし、Program.cs で実行する必要があります。

Application.AddMessageFilter(new UserActivity());

自分でユーザーの非アクティブのチェックを実行できるようにするにはどうすればよいですか。いくつかのチェックボックスをオンにすると、チェックが開始されます。

そして、アプリだけでなくすべてのシステムで、グローバルなユーザーアクティビティを確認したい.

不必要にCPUを使いたくない。または、別のソリューションを使用する必要がありますか?

4

2 に答える 2

8

私はこれを見つけました、そしてそれは完璧に動作します! したがって、別の人に問題がある場合は、ここに解決策があります:

    [StructLayout(LayoutKind.Sequential)]
    public struct LASTINPUTINFO
    {
        public uint cbSize;
        public uint dwTime;
    }

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


    public static TimeSpan? GetInactiveTime()
    {
        LASTINPUTINFO info = new LASTINPUTINFO();
        info.cbSize = (uint)Marshal.SizeOf(info);
        if (GetLastInputInfo(ref info))
            return TimeSpan.FromMilliseconds(Environment.TickCount - info.dwTime);
        else
            return null;
    }
于 2012-05-27T18:30:59.360 に答える