mirror of
https://github.com/jie65535/Helpers.git
synced 2025-06-01 17:29:12 +08:00
Add Idle Util
This commit is contained in:
parent
4e1b3b6fb5
commit
f856080ba3
167
IdleUtil/IdleUtil.cs
Normal file
167
IdleUtil/IdleUtil.cs
Normal file
@ -0,0 +1,167 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Threading;
|
||||
|
||||
namespace Utils
|
||||
{
|
||||
/// <summary>
|
||||
/// 空闲监控工具
|
||||
/// 提供定时器操作方法,当用户超过指定时间未操作时,触发Timeout事件
|
||||
/// </summary>
|
||||
public class IdleUtil
|
||||
{
|
||||
#region Public
|
||||
|
||||
/// <summary>
|
||||
/// 重置定时器为新时间
|
||||
/// </summary>
|
||||
/// <param name="dueTime">超过多少时间未操作发出事件(毫秒)</param>
|
||||
public void Reset(int dueTime)
|
||||
{
|
||||
Start(dueTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 重置定时器
|
||||
/// </summary>
|
||||
public void Reset()
|
||||
{
|
||||
Start(this.DueTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 开始计时
|
||||
/// </summary>
|
||||
/// <param name="dueTime">超过多少时间未操作发出事件(毫秒)</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>
|
||||
/// 停止计时
|
||||
/// </summary>
|
||||
public void Stop()
|
||||
{
|
||||
IsRunning = false;
|
||||
Timer.Change(Timeout.Infinite, Timeout.Infinite);
|
||||
}
|
||||
|
||||
#endregion Public
|
||||
|
||||
#region Event
|
||||
|
||||
/// <summary>
|
||||
/// 超过指定事件未操作事件
|
||||
/// </summary>
|
||||
public event EventHandler TimeoutEvent;
|
||||
|
||||
#endregion Event
|
||||
|
||||
#region Ctor
|
||||
|
||||
public IdleUtil()
|
||||
{
|
||||
Timer = new Timer(OnTimeout);
|
||||
}
|
||||
|
||||
#endregion Ctor
|
||||
|
||||
#region Private
|
||||
|
||||
/// <summary>
|
||||
/// 定时器
|
||||
/// </summary>
|
||||
private readonly Timer Timer;
|
||||
|
||||
/// <summary>
|
||||
/// 用户要求定时时间
|
||||
/// </summary>
|
||||
private int DueTime;
|
||||
|
||||
/// <summary>
|
||||
/// 线程是否运行
|
||||
/// </summary>
|
||||
private bool IsRunning;
|
||||
|
||||
/// <summary>
|
||||
/// 监控线程
|
||||
/// </summary>
|
||||
private Thread MonitorThread;
|
||||
/// <summary>
|
||||
/// 监控线程方法
|
||||
/// </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);
|
||||
// 只触发一次
|
||||
Timer.Change(Timeout.Infinite, Timeout.Infinite);
|
||||
}
|
||||
|
||||
#endregion Trigger
|
||||
|
||||
#region WindowsAPI
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
|
||||
|
||||
/// <summary>
|
||||
/// 获取用户最后一次输入的时间
|
||||
/// </summary>
|
||||
/// <returns>最后一次输入的时间</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
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user