检测用户空闲时间(针对每个应用程序实例)

5
我需要在我的应用程序中实现用户空闲检测(仅限于“我的应用程序实例”)。 我无法使用GetLastInputInfo,因为它是特定于会话的用户输入: GetLastInputInfo不提供所有正在运行的会话中跨系统的用户输入信息。相反,GetLastInputInfo仅为调用该函数的会话提供特定于会话的用户输入信息。 有什么建议吗?

1
那是什么类型的应用程序?Windows 应用程序吗?你在多台电脑上运行它吗?你想得到什么? - Davide Piras
是的,Windows 应用程序。它可以在同一台机器上的相同“Windows 用户”下运行。 - halorty
当你说“每个应用程序实例”时,是指在系统中检查所有正在运行的应用程序的空闲状态,还是只检查你自己的应用程序? - user47589
只是我的应用程序。 - halorty
3个回答

5
我假设您想检测空闲时间,但仅在应用程序处于活动状态时才检测。然后,您必须准确地定义您的应用程序何时处于活动状态。当您的应用程序处于活动状态(根据您自己的定义),您可以定期调用GetLastInputInfo来确定应用程序在活动状态下的空闲时间(例如使用某种计时器)。
Windows有一个前台窗口的概念,可以使用GetForegroundWindow来检索当前前台窗口。您可以使用GetWindowThreadProcessId查找拥有前台窗口的进程ID。如果该进程ID是您的进程ID,则知道即使您的应用程序具有多个窗口,您也是前台进程。您将不得不以定期间隔执行此检测,就像您必须检查空闲时间一样。
您不应担心GetLastInputInfo仅提供有关会话的信息。如果多个用户登录到同一台Windows计算机上,则每个用户都将拥有自己的会话,但是另一个用户在会话中是否空闲不应影响您检测应用程序用户是否空闲。

我想检测我的应用程序处于活动和非活动状态时的空闲时间。我的意思是当它被最小化,当用户使用其他应用程序时,当用户使用我的应用程序(活动状态)但什么也不做(不使用鼠标、键盘等)时。 - halorty
当我的应用程序处于活动状态(按照我的定义)时,我无法在常规间隔内使用_GetLastInputInfo_,例如当我的应用程序被最小化时(按照我的定义,我的应用程序是活动的)。 - halorty

4

2
如果这是一个 Windows Forms 应用程序,您可以创建一个空闲事件处理程序并订阅 Application.Idle 事件。当应用程序完成处理并即将进入空闲状态时,您将收到通知。

我需要在用户空闲时收到通知,而不是应用程序空闲时。我的应用程序有很多后台处理任务。 - halorty
@halorty:就Application.Idle而言,“idle”是指用户界面空闲。当UI线程处理完成并即将进入空闲状态时,您会收到Application.Idle事件。在后台线程上发生的事情不会改变这一点。 - Jim Mischel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接