mirror of
https://github.com/jie65535/Helpers.git
synced 2025-10-16 17:29:45 +08:00
Add Idle Util
This commit is contained in:
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>
|
||||||
|
/// <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
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user