我有一个应用程序,我必须在x秒不活动后注销。 因此,我有一个计时器继续计算从上次用户活动重置的时间跨度:
dtLastActivity = DateTime.Now;
所以问题是我认为这不是将我的程序中的每个单个事件与上述代码相关联的最佳方法。 但最终我不需要每个事件:所有有用的是跟踪KEYPRESS和MOUSEUP。
在MainWindow中跟踪这两个事件是否正确?
我必须承认,我仍然没有付诸实践(但我会),因为我不确定这是否是标题中最好的方法。
对WPF不熟悉我也不清楚如果在主窗口中跟踪键盘和鼠标不会影响孩子们的行为(这些控件实际上是事件的目标)。
提前感谢您的帮助。
--- --- EDIT 建议的解决方案非常优雅。特别是这一个:
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,
};
}
}
但它太自动了。我无法控制它。 例如。如果我从一开始就使用它,它在启动之前就会空闲,因为我的应用程序有很长的启动时间,有启动画面,反序列化等等......
Fruchtzwerg提出的解决方案更符合我的需求,因为我可以完全控制它。它的另一个优点是,如果我点击另一个应用程序,则不会重置计时器!!
答案 0 :(得分:2)
我通常使用你描述的方法。我运行计时器并重启每次交互。窗口的事件是:
PreviewMouseDown="Window_Action"
PreviewKeyDown="Window_Action"
重新启动计时器:
private void Window_Action(object Sender, InputEventArgs e)
{
IdleTimer.Stop();
IdleTimer.Start();
}
这种灵魂从来没有任何延伸。使用stopwatch重启计时器的时间不到80。所以资源在我看来没问题。
您还可以通过在活动中添加字词来指定用户互动。
预览 - 事件不会扰乱其他事件。这种隧道行为描述为here。