gpt4 book ai didi

c# - WPF:应用程序空闲时间

转载 作者:可可西里 更新时间:2023-11-01 09:00:41 24 4
gpt4 key购买 nike

我需要计算我的 WPF 应用程序的空闲时间(空闲时间 = 当没有键盘输入、鼠标输入(移动 + 点击)发生时)。到目前为止,我尝试了两种方法,但似乎都没有用:

  1. 使用调度程序在每次获得 contextIdle 优先级时调用委托(delegate),问题是绑定(bind)和许多其他操作调用它,因此我不能真正使用它。
  2. 我使用输入管理器注册了“System.Windows.Input.InputManager.Current.PostProcessInput”事件,每次调用它时我都重新开始空闲时间计数。第二种方法似乎很有前途,但问题是当鼠标悬停在应用程序上时(它有焦点)我不断收到事件。

还有其他想法吗?或者修改第二个解决方案的方法?

最佳答案

我使用几种不同的技术解决了这个问题,这些技术综合起来为我提供了一个很好的解决方案。我使用 GetLastInput 计算出系统最后一次接触的时间这在其他地方有详细记录,但这是我的方法:

public static class User32Interop
{
public static TimeSpan GetLastInput()
{
var plii = new LASTINPUTINFO();
plii.cbSize = (uint)Marshal.SizeOf(plii);
if (GetLastInputInfo(ref plii))
return TimeSpan.FromMilliseconds(Environment.TickCount - plii.dwTime);
else
throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
}

[DllImport("user32.dll", SetLastError = true)]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
struct LASTINPUTINFO {
public uint cbSize;
public uint dwTime;
}
}

这只告诉我系统何时空闲,而不是应用程序。如果用户单击进入 Word 并在那里工作了一个小时,我仍然想要超时。为了处理这种情况,我只是通过重写应用程序对象上的 OnDeactivated 和 OnActivated 方法来记住当我的应用程序失去焦点时:

    override protected void OnDeactivated(EventArgs e)
{
this._lostFocusTime = DateTime.Now;
base.OnDeactivated(e);
}

protected override void OnActivated(EventArgs e)
{
this._lostFocusTime = null;
base.OnActivated(e);
}

我的 IsIdle 例程已添加到应用程序对象。它处理应用程序获得焦点但什么也没发生的全局情况 (IsMachineIdle) 以及用户正在做其他事情时应用程序失去焦点的特定情况 (isAppIdle):

    public bool IsIdle
{
get
{
TimeSpan activityThreshold = TimeSpan.FromMinutes(1);
TimeSpan machineIdle = Support.User32Interop.GetLastInput();
TimeSpan? appIdle = this._lostFocusTime == null ? null : (TimeSpan?)DateTime.Now.Subtract(_lostFocusTime.Value);
bool isMachineIdle = machineIdle > activityThreshold ;
bool isAppIdle = appIdle != null && appIdle > activityThreshold ;
return isMachineIdle || isAppIdle;
}
}

我做的最后一件事是创建一个定时器循环,在几秒钟内轮询这个标志事件。

这似乎工作正常。

关于c# - WPF:应用程序空闲时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3289438/

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