我只需要在我的应用程序中检测用户空闲(每个“我的应用程序实例”)。
我不能使用GetLastInputInfo因为是特定于会话的用户输入:
GetLastInputInfo不提供跨所有正在运行的会话的系统范围的用户输入信息。相反,GetLastInputInfo仅为调用该函数的会话提供特定于会话的用户输入信息。
有什么建议么 ?
我只需要在我的应用程序中检测用户空闲(每个“我的应用程序实例”)。
我不能使用GetLastInputInfo因为是特定于会话的用户输入:
GetLastInputInfo不提供跨所有正在运行的会话的系统范围的用户输入信息。相反,GetLastInputInfo仅为调用该函数的会话提供特定于会话的用户输入信息。
有什么建议么 ?
我假设您想检测空闲时间,但前提是您的应用程序处于活动状态。然后,您必须准确定义您的应用程序处于活动状态的含义。当您的应用程序处于活动状态时(根据您自己的定义),您可以定期调用GetLastInputInfo来确定应用程序处于活动状态时的空闲时间(例如,使用某种计时器)。
Windows 有一个前景窗口的概念,可以使用GetForegroundWindow检索当前的前景窗口。您可以使用GetWindowThreadProcessId来查找拥有前台窗口的进程的进程 ID。如果该进程 ID 是您的进程 ID,即使您的应用程序有多个窗口,您也知道您是前台进程。您必须定期执行此检测,就像您必须检查空闲时间一样。
您不应该GetLastInputInfo
只关心提供有关会话的信息。如果多个用户登录到同一台 Windows 计算机,他们每个人都有自己的会话,但另一个用户在会话中处于空闲状态或非空闲状态不应影响您检测应用程序用户是否空闲的方式。
您可以使用Application.AddMessageFilter
并观察代表用户交互的消息(例如鼠标、键盘,可能是菜单激活)。
If this is a Windows Forms application, you can create an idle event handler and subscribe to the Application.Idle event. You'll get a notification when the application finishes processing and is about to enter the idle state.