HKC/DM_Weight/util/CheckComputerFreeState.cs

76 lines
2.6 KiB
C#

using DM_Weight.Port;
using DM_Weight.ViewModels;
using log4net;
using log4net.Core;
using log4net.Repository.Hierarchy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace DM_Weight.util
{
public class CheckComputerFreeState
{
private static readonly ILog logger = LogManager.GetLogger(typeof(CheckComputerFreeState));
/// <summary>
/// 创建结构体用于返回捕获时间
/// </summary>
[StructLayout(LayoutKind.Sequential)]
struct LASTINPUTINFO
{
/// <summary>
/// 设置结构体块容量
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public int cbSize;
/// <summary>
/// 抓获的时间
/// </summary>
[MarshalAs(UnmanagedType.U4)]
public uint dwTime;
}
[DllImport("user32.dll")]
private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
/// <summary>
/// 获取键盘和鼠标没有操作的时间
/// </summary>
/// <returns>用户上次使用系统到现在的时间间隔,单位为秒</returns>
public static long GetLastInputTime()
{
LASTINPUTINFO vLastInputInfo = new LASTINPUTINFO();
vLastInputInfo.cbSize = Marshal.SizeOf(vLastInputInfo);
if (!GetLastInputInfo(ref vLastInputInfo))
{
return 0;
}
else
{
//var count = (Environment.TickCount & Int32.MaxValue) - (long)vLastInputInfo.dwTime;
//var icount = count / 1000;
//return icount;
// 使用 64 位 TickCount 避免回绕问题
long currentTick = Environment.TickCount64;
long lastInputTick = vLastInputInfo.dwTime;
logger.Info($"获取用户未操作时间间隔{currentTick}-{lastInputTick}");
// 处理可能的回绕(虽然使用 64 位后极不可能发生)
if (currentTick < lastInputTick)
{
// 发生了回绕,调整计算
lastInputTick -= uint.MaxValue + 1L;
}
long elapsedMilliseconds = currentTick - lastInputTick;
long seconds = elapsedMilliseconds / 1000;
logger.Info($"获取用户未操作时间间隔{currentTick}-{lastInputTick}-{elapsedMilliseconds}-{seconds}-{Math.Max(0, seconds)}");
return Math.Max(0, seconds);
}
}
}
}