アプリケーションでユーザーの非アクティブを確認したいと考えています。少し調べてみたところ、GetLastInputInfo と Environment.TickCount を使用することにしました。非常に単純に思えたからです。残念ながら、少し扱いにくいことがわかりました。
GetLastInputInfo は、最後の "TickCount" 値を DWORD (つまり UInt32) として持つLASTINPUTINFO構造体を返します。理論的には、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 日間専用のコンピューターを使用せずにこれをテストする方法についてのアドバイスもいただければ幸いです。