Я пытался изменить доступность пользователя между оффлайн и онлайн, изменив изображение пользователя (красный оффлайн, зеленый онлайн).Я использую этот код для изменения статуса пользователя с онлайн на офлайн, основываясь на событиях клавиатуры и мыши:
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
}
Теперь я хочу сделать ту же идею, чтобы при запуске события мыши или клавиатуры снова изменить изображение на онлайн-пользователя.