C# WPF如何有效地检测用户活动
我有一个应用程序,在该应用程序中,我必须在x秒的不活动后注销。 因此,我有一个计时器正在运行,并根据上次用户活动计算时间跨度,重置为:C# WPF如何有效地检测用户活动,c#,wpf,events,android-activity,C#,Wpf,Events,Android Activity,我有一个应用程序,在该应用程序中,我必须在x秒的不活动后注销。 因此,我有一个计时器正在运行,并根据上次用户活动计算时间跨度,重置为: dtLastActivity = DateTime.Now; 所以问题是,我认为将程序中的每个事件与上述代码关联不是最好的方法。 但最终我并不需要所有的事件:所有有用的是跟踪按键和鼠标 在主窗口中跟踪这两个事件是否正确? 我必须承认,我还没有将这一点付诸实践(但我会),因为我不确定这是否是实现标题中目标的最佳方法 作为WPF新手,我也不清楚主窗口中的键盘和鼠标
dtLastActivity = DateTime.Now;
所以问题是,我认为将程序中的每个事件与上述代码关联不是最好的方法。
但最终我并不需要所有的事件:所有有用的是跟踪按键和鼠标
在主窗口中跟踪这两个事件是否正确?
我必须承认,我还没有将这一点付诸实践(但我会),因为我不确定这是否是实现标题中目标的最佳方法
作为WPF新手,我也不清楚主窗口中的键盘和鼠标是否不会影响儿童的行为(这些控件实际上是事件的目标)
提前感谢您的帮助
---编辑---
提出的解决方案非常优雅。特别是这个:
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提出的解决方案与我的需求非常相似,因为我可以完全控制它。它的另一个优点是,如果我点击另一个应用程序,计时器不会重置 我通常使用您描述的方法。我运行计时器并重新启动每个交互。窗口的事件包括:
PreviewMouseDown="Window_Action"
PreviewKeyDown="Window_Action"
重新启动计时器:
private void Window_Action(object Sender, InputEventArgs e)
{
IdleTimer.Stop();
IdleTimer.Start();
}
从来没有和这个灵魂有过任何关系。重新启动计时器需要不到80个滴答声。因此,我认为资源是没有问题的
您还可以通过在事件中添加术语来指定用户交互
预览事件不会干扰其他事件。描述了这种隧道行为。可能的重复;你的解决方案也正是我要寻找的。我只是想知道你是否有信心在主窗口中抓取这些事件不会以任何方式影响儿童事件。