gpt4 book ai didi

c# - WPF如何有效检测用户 Activity

转载 作者:行者123 更新时间:2023-11-30 23:26:10 25 4
gpt4 key购买 nike

我有一个应用程序,我必须在闲置 x 秒后注销。因此,我有一个计时器在运行,并从上次重置的用户 Activity 开始计算时间跨度:

dtLastActivity = DateTime.Now;

所以问题是,我认为将程序中的每个事件与上述代码相关联并不是最好的方法。但最后我不需要每个事件:所有有用的是跟踪 KEYPRESS 和 MOUSEUP。

在主窗口中跟踪这两个事件是否正确?

我必须承认,我还没有(但我会)付诸实践,因为我不确定这是否是实现标题中目的的最佳方法。

作为 WPF 的新手,我也不清楚在主窗口中跟踪键盘和鼠标是否不会影响 child 的行为(这些控件实际上是事件的目标)。

提前感谢您的帮助。

---编辑---提出的解决方案非常优雅。特别是这个:

    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();
}

这个灵魂从来没有任何问题。使用 stopwatch 重新启动计时器需要不到 80 个刻度。 .所以资源在我看来是没问题的。

您还可以通过在 Activity 中添加术语来指定用户交互。

预览 Activity 不会干扰其他 Activity 。这种隧道行为被描述为here .

关于c# - WPF如何有效检测用户 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36968376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com