using System;
using System.Runtime.InteropServices;
namespace BlahBlah
{
public static class IdleTimeDetector
{
[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
public static IdleTimeInfo GetIdleTimeInfo()
{
int systemUptime = Environment.TickCount,
lastInputTicks = 0,
idleTicks = 0;
LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo);
lastInputInfo.dwTime = 0;
if (GetLastInputInfo(ref lastInputInfo))
{
lastInputTicks = (int)lastInputInfo.dwTime;
idleTicks = systemUptime - lastInputTicks;
}
return new IdleTimeInfo
{
LastInputTime = DateTime.Now.AddMilliseconds(-1 * idleTicks),
IdleTime = new TimeSpan(0, 0, 0, 0, idleTicks),
SystemUptimeMilliseconds = systemUptime,
};
}
}
public class IdleTimeInfo
{
public DateTime LastInputTime { get; internal set; }
public TimeSpan IdleTime { get; internal set; }
public int SystemUptimeMilliseconds { get; internal set; }
}
internal struct LASTINPUTINFO
{
public uint cbSize;
public uint dwTime;
}
}
사용할 때 아래와 같이 이용
var idleTime = IdleTimeDetector.GetIdleTimeInfo();
if (idleTime.IdleTime.TotalMinutes >= 5)
{
// They are idle!
}
참고한 싸이트
https://stackoverflow.com/questions/4963135/wpf-inactivity-and-activity/4970019#4970019
테스트 한 결과 정상적으로 잘 작동한다.
이것을 이용하면 idle 상태를 체크해서 자동 로그아웃 등을 사용할 수 있을 것으로 판단된다.
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getlastinputinfo
Retrieves the time of the last input event.
'.NET' 카테고리의 다른 글
C# WinFrom에서 Telerik의 RadSplitContainer사용하는 방법 (0) | 2022.04.12 |
---|---|
C# PropertyGrid에서 enum을 이용한 숫자 표시 방법(Enum Description 사용 방법) (0) | 2022.04.08 |
C# 코드 스타일 옵션 변경 (0) | 2022.03.14 |
convert time_t to System.Datetime and TimeZoneInfo (0) | 2020.10.14 |
WPF 문자열 포맷 정리 (String Format) (0) | 2017.02.10 |