我想檢查我的應用程序中的用戶不活動。我做了一些研究,並使用GetLastInputInfo和Environment.TickCount,因爲它看起來很簡單。不幸的是,它變得有點棘手。GetLastInputInfo的整數環繞問題
GetLastInputInfo返回一個LASTINPUTINFO結構,它具有最後一個「TickCount」值作爲DWORD(即UInt32)。理論上,我想從Environment.TickCount中減去這個值,這給了我多少毫秒的用戶一直處於非活動狀態。
Environment.TickCount返回一個Int32。兩者都會在達到最大值時迴繞,這對於Int32和UInt32是不同的。我處理這個問題有點不舒服,特別是因爲代碼基本上不能被測試(Environment.TickCount在24.9天后環繞並且該功能在此之前到期)。
這是我到目前爲止已經完成:
[DllImport("user32.dll")]
static extern bool GetLastInputInfo(out LastInputInfo plii);
struct LastInputInfo
{
public uint cbSize;
public uint dwTime;
}
//(...)
var lastInputInfo = new LastInputInfo();
lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo);
if (GetLastInputInfo(out lastInputInfo))
{
// The next line obviously will not work when either of the terms has wrapped around
var idleTime = Environment.TickCount - lastInputInfo.dwTime;
if (idleTime > mTimeOut)
{
// user is inactive!
}
}
有一個很簡單的方法來處理這兩種迴繞或者我應該使用其他方法來共檢測用戶閒置?此外,如何在25天內無需專用計算機的情況下對此進行任何建議,我們都非常感謝。
請記住,這種方法只能檢測用戶閒置時間模〜50天。 –
@HristoIliev感謝您的提醒,但該功能的使用情況是5分鐘到1小時不活動,所以這不是問題。 – Asik