Как изменить изображение в зависимости от активности клавиатуры и мыши? - PullRequest
0 голосов
/ 19 декабря 2018

Я пытался изменить доступность пользователя между оффлайн и онлайн, изменив изображение пользователя (красный оффлайн, зеленый онлайн).Я использую этот код для изменения статуса пользователя с онлайн на офлайн, основываясь на событиях клавиатуры и мыши:

public sealed class UserActivityMonitor
{
    /// <summary>Determines the time of the last user activity (any mouse activity or key press).</summary>
    /// <returns>The time of the last user activity.</returns>

    public DateTime LastActivity => DateTime.Now - this.InactivityPeriod;

    /// <summary>The amount of time for which the user has been inactive (no mouse activity or key press).</summary>

    public TimeSpan InactivityPeriod
    {
        get
        {
            var lastInputInfo = new LastInputInfo();
            lastInputInfo.CbSize = Marshal.SizeOf(lastInputInfo);
            GetLastInputInfo(ref lastInputInfo);
            uint elapsedMilliseconds = (uint) Environment.TickCount - lastInputInfo.DwTime;
            elapsedMilliseconds = Math.Min(elapsedMilliseconds, int.MaxValue);
            return TimeSpan.FromMilliseconds(elapsedMilliseconds);
        }
    }

    public async Task WaitForInactivity(TimeSpan inactivityThreshold, TimeSpan checkInterval, CancellationToken cancel)
    {
        while (true)
        {
            await Task.Delay(checkInterval, cancel);

            if (InactivityPeriod > inactivityThreshold)
                return;
        }
    }

    // ReSharper disable UnaccessedField.Local
    /// <summary>Struct used by Windows API function GetLastInputInfo()</summary>

    struct LastInputInfo
    {
        #pragma warning disable 649
        public int  CbSize;
        public uint DwTime;
        #pragma warning restore 649
    }

    // ReSharper restore UnaccessedField.Local

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool GetLastInputInfo(ref LastInputInfo plii);
}

Затем я реализую что-то, что меняет изображение пользователя после определенного периода бездействия.

    readonly UserActivityMonitor _monitor = new UserActivityMonitor();

protected override async void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    await _monitor.WaitForInactivity(TimeSpan.FromMinutes(10), TimeSpan.FromSeconds(5), CancellationToken.None);
    //changepicture user from online to online
}

Теперь я хочу сделать ту же идею, чтобы при запуске события мыши или клавиатуры снова изменить изображение на онлайн-пользователя.

...