【问题标题】:Detect user idle (per application instance)检测用户空闲(每个应用程序实例)
【发布时间】:2011-06-27 15:18:59
【问题描述】:

我只需要在我的应用程序中检测用户空闲(每个“我的应用程序实例”)。
我不能使用 GetLastInputInfo 因为是特定于会话的用户输入

GetLastInputInfo 在所有正在运行的会话中提供系统范围的用户输入信息。相反,GetLastInputInfo 仅为调用该函数的会话提供特定于会话的用户输入信息。

有什么建议吗?

【问题讨论】:

  • 那是什么应用程序? Windows 应用程序?你让它在多台计算机上运行?你想得到什么?
  • 是的,Windows 应用程序。它可以在同一个“Windows用户”的同一台机器上运行
  • 当您说“每个应用程序实例”时,您是指检查系统中所有正在运行的应用程序是否空闲,还是只检查您自己的应用程序?
  • 只是我自己的应用程序而已

标签: c# .net idle-processing


【解决方案1】:

我假设您想检测空闲时间,但前提是您的应用程序处于活动状态。然后,您必须准确定义您的应用程序处于活动状态的含义。当您的应用程序处于活动状态时(根据您自己的定义),您可以定期调用 GetLastInputInfo 以确定应用程序处于活动状态时的空闲时间(例如,使用某种计时器)。

Windows 有一个前景窗口的概念,可以使用GetForegroundWindow 检索当前前景窗口。您可以使用GetWindowThreadProcessId 来查找拥有前台窗口的进程的进程ID。如果该进程 ID 是您的进程 ID,即使您的应用程序有多个窗口,您也知道您是前台进程。您必须定期执行此检测,就像您必须检查空闲时间一样。

您不必担心GetLastInputInfo 只提供有关会话的信息。如果多个用户登录到同一台 Windows 计算机,他们将各自拥有自己的会话,但另一个用户在会话中处于空闲状态或非空闲状态不应影响您检测应用程序用户是否空闲的方式。

【讨论】:

  • 我想检测我的应用程序处于活动状态和非活动状态时的空闲时间。我的意思是什么时候最小化,什么时候最大化但用户使用其他应用程序,当用户使用我的应用程序(活动)但什么都不做(不使用鼠标、键盘等)时
  • 当我的应用程序处于活动状态时(根据我自己的定义,上面)我不能定期使用 GetLastInputInfo,例如当我的应用程序被最小化时(在我自己的定义中) ,我的应用程序处于活动状态)。
【解决方案2】:

您可以使用 Application.AddMessageFilter 并观察代表用户交互的消息(例如鼠标、键盘、可能是菜单激活)。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我需要通知用户空闲,而不是应用程序空闲。我的应用程序有很多后台处理任务。
    • @halorty:就Application.Idle 而言,“空闲”是用户界面空闲。当 UI 线程完成处理并即将进入空闲状态时,您会收到 Application.Idle 事件。后台线程上发生的事情不会改变这一点。
    猜你喜欢
    • 1970-01-01
    • 2017-03-13
    • 2015-09-15
    • 1970-01-01
    • 2021-08-12
    • 2011-06-04
    • 2015-01-25
    • 2017-05-07
    • 1970-01-01
    相关资源
    最近更新 更多