Add Idle Util

This commit is contained in:
筱傑
2019-08-01 10:34:58 +08:00
committed by GitHub
parent 4e1b3b6fb5
commit f856080ba3

167
IdleUtil/IdleUtil.cs Normal file
View File

@@ -0,0 +1,167 @@
using System;
using System.Runtime.InteropServices;
using System.Threading;
namespace Utils
{
/// <summary>
/// <20><><EFBFBD>м<EFBFBD><D0BC>ع<EFBFBD><D8B9><EFBFBD>
/// <20><EFBFBD><E1B9A9>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʱ<EFBFBD><CAB1>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Timeout<75>¼<EFBFBD>
/// </summary>
public class IdleUtil
{
#region Public
/// <summary>
/// <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>Ϊ<EFBFBD><CEAA>ʱ<EFBFBD><CAB1>
/// </summary>
/// <param name="dueTime"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룩</param>
public void Reset(int dueTime)
{
Start(dueTime);
}
/// <summary>
/// <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
/// </summary>
public void Reset()
{
Start(this.DueTime);
}
/// <summary>
/// <20><>ʼ<EFBFBD><CABC>ʱ
/// </summary>
/// <param name="dueTime"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룩</param>
public void Start(int dueTime)
{
DueTime = dueTime;
if (!IsRunning)
{
IsRunning = true;
MonitorThread = new Thread(Moniter) { IsBackground = true };
MonitorThread.Start();
}
Timer.Change(dueTime, Timeout.Infinite);
}
/// <summary>
/// ֹͣ<CDA3><D6B9>ʱ
/// </summary>
public void Stop()
{
IsRunning = false;
Timer.Change(Timeout.Infinite, Timeout.Infinite);
}
#endregion Public
#region Event
/// <summary>
/// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>¼<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
/// </summary>
public event EventHandler TimeoutEvent;
#endregion Event
#region Ctor
public IdleUtil()
{
Timer = new Timer(OnTimeout);
}
#endregion Ctor
#region Private
/// <summary>
/// <20><>ʱ<EFBFBD><CAB1>
/// </summary>
private readonly Timer Timer;
/// <summary>
/// <20>û<EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1>
/// </summary>
private int DueTime;
/// <summary>
/// <20>߳<EFBFBD><DFB3>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
private bool IsRunning;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
/// </summary>
private Thread MonitorThread;
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>̷߳<DFB3><CCB7><EFBFBD>
/// </summary>
private void Moniter()
{
while (IsRunning)
{
if (GetLastInputTime() == 0)
Reset();
Thread.Sleep(1000);
}
}
#endregion Private
#region Trigger
private void OnTimeout(object _)
{
if (TimeoutEvent != null)
TimeoutEvent(this, EventArgs.Empty);
// ֻ<><D6BB><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
Timer.Change(Timeout.Infinite, Timeout.Infinite);
}
#endregion Trigger
#region WindowsAPI
[DllImport("user32.dll")]
private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
/// <summary>
/// <20><>ȡ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
/// </summary>
/// <returns><3E><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1></returns>
private static uint GetLastInputTime()
{
uint idleTime = 0;
LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo);
lastInputInfo.dwTime = 0;
uint envTicks = (uint)Environment.TickCount;
if (GetLastInputInfo(ref lastInputInfo))
{
uint lastInputTick = lastInputInfo.dwTime;
idleTime = envTicks - lastInputTick;
}
return ((idleTime > 0) ? (idleTime / 1000) : 0);
}
[StructLayout(LayoutKind.Sequential)]
private struct LASTINPUTINFO
{
public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO));
[MarshalAs(UnmanagedType.U4)]
public UInt32 cbSize;
[MarshalAs(UnmanagedType.U4)]
public UInt32 dwTime;
}
#endregion WindowsAPI
}
}