Files
1258/JinYuan.ControlLib/UserStateMonitor.cs
T
2026-08-04 18:36:40 +08:00

175 lines
4.8 KiB
C#

using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Threading;
namespace JinYuan.ControlLib
{
/// <summary>
/// 监视鼠标键盘操作。
/// </summary>
public class UserStateMonitor : Component
{
//通过 Interval 属性调节扫描键盘鼠标状态的间隔时间,通过 Timeout 属性(无键盘操作时间间隔)控制判断是否离开
/// <summary>
/// 离开时间,单位:秒
/// </summary>
private int _timeout = 5000;
private int _lastActiveTick;
private Timer _timer;
private int _interval = 1000;
private bool _started;
private bool _active = true;
private static readonly object EventUseStateChanged = new object();
public UserStateMonitor()
: base()
{
}
public UserStateMonitor(IContainer container)
: base()
{
container.Add(this);
}
public event UserStateChangedEventHandler UserStateChanged
{
add { base.Events.AddHandler(EventUseStateChanged, value); }
remove { base.Events.RemoveHandler(EventUseStateChanged, value); }
}
/// <summary>
/// 默认值:30分钟
/// </summary>
[DefaultValue(1800000)]
public int Timeout
{
get { return _timeout; }
set
{
_timeout = Math.Max(5000, value);
}
}
[DefaultValue(1000)]
public int Interval
{
get { return _interval; }
set
{
_interval = Math.Max(500, value);
if (_started)
{
Timer.Change(0, _interval);
}
else
{
Timer.Change(System.Threading.Timeout.Infinite, _interval);
}
}
}
private Timer Timer
{
get
{
if (_timer == null)
{
_timer = new Timer(
new TimerCallback(delegate (object obj)
{
LASTINPUTINFO lii = new LASTINPUTINFO();
lii.size = 8;
if (GetLastInputInfo(ref lii))
{
_lastActiveTick = Math.Max(lii.lastTick, _lastActiveTick);
bool active = Environment.TickCount - _lastActiveTick < _timeout;
if (_active != active)
{
_active = active;
OnUserStateChanged(new UserStateChangedEventArgs(active));
}
}
}),
null,
System.Threading.Timeout.Infinite,
_interval);
}
return _timer;
}
}
public void Start()
{
if (!_started)
{
Timer.Change(_interval, _interval);
_started = true;
}
}
/// <summary>
/// 开始监控
/// </summary>
/// <param name="timeOut">监控时间间隔,单位:分钟</param>
public void Start(int timeOut)
{
if (!_started)
{
_timeout = timeOut * 1000;//转换成秒
Timer.Change(_interval, _interval);
_started = true;
}
}
public void Stop()
{
if (_started)
{
Timer.Change(System.Threading.Timeout.Infinite, _interval);
_started = false;
}
}
[StructLayout(LayoutKind.Sequential)]
private struct LASTINPUTINFO
{
public int size;
public int lastTick;
}
[DllImport("user32.dll")]
private static extern bool GetLastInputInfo(ref LASTINPUTINFO lii);
protected virtual void OnUserStateChanged(UserStateChangedEventArgs e)
{
UserStateChangedEventHandler handler =
base.Events[EventUseStateChanged] as UserStateChangedEventHandler;
if (handler != null)
{
handler(this, e);
}
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
{
Stop();
if (_timer != null)
{
_timer.Dispose();
_timer = null;
}
}
}
}
}